Java Blog From WeiChunHua

Java

常用链接

统计

develop

news

最新评论

2008年1月16日 #

JDBC连接数据库大全

          现在有好多初学jsp的网友经常会问数据库怎么连接啊,怎么老出错啊?所以我集中的在这写篇文章供大家参考,其实这种把数据库逻辑全部放在jsp里未必是好的做法,但是有利于初学者学习,所以我就这样做了,当大家学到一定程度的时候,可以考虑用MVC的模式开发。在练习这些代码的时候,你一定将jdbc的驱动程序放到服务器的类路径里,然后要在数据库里建一个表test,有两个字段比如为test1test2,可以用下面SQL
create table test(test1 varchar(20),test2 varchar(20)
然后向这个表写入一条测试纪录
那么现在开始我们的jsp和数据库之旅吧。
一、jsp连接Oracle8/8i/9i数据库(用thin模式)
testoracle.jsp
如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl";
//orcl
为你的数据库的SID
String user="scott";
String password="tiger";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:<%=rs.getString(1)%>
您的第二个字段内容为:<%=rs.getString(2)%>
<%}%>
<%out.print("
数据库操作成功,恭喜你");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
二、jsp连接Sql Server7.0/2000数据库
testsqlserver.jsp
如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
//pubs
为你的数据库的
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:<%=rs.getString(1)%>
您的第二个字段内容为:<%=rs.getString(2)%>
<%}%>
<%out.print("
数据库操作成功,恭喜你");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
三、jsp连接DB2数据库
testdb2.jsp
如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample";
//sample
为你的数据库名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:<%=rs.getString(1)%>
您的第二个字段内容为:<%=rs.getString(2)%>
<%}%>
<%out.print("
数据库操作成功,恭喜你");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
四、jsp连接Informix数据库
testinformix.jsp
如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url =
"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword";
//testDB
为你的数据库名
Connection conn= DriverManager.getConnection(url);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:<%=rs.getString(1)%>
您的第二个字段内容为:<%=rs.getString(2)%>
<%}%>
<%out.print("
数据库操作成功,恭喜你");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
五、jsp连接Sybase数据库
testmysql.jsp
如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/tsdata";
//tsdata
为你的数据库名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:<%=rs.getString(1)%>
您的第二个字段内容为:<%=rs.getString(2)%>
<%}%>
<%out.print("
数据库操作成功,恭喜你");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
六、jsp连接MySQL数据库
testmysql.jsp
如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//testDB
为你的数据库名
Connection conn= DriverManager.getConnection(url);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:<%=rs.getString(1)%>
您的第二个字段内容为:<%=rs.getString(2)%>
<%}%>
<%out.print("
数据库操作成功,恭喜你");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
七、jsp连接PostgreSQL数据库
testmysql.jsp
如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/soft"
//soft
为你的数据库名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:<%=rs.getString(1)%>
您的第二个字段内容为:<%=rs.getString(2)%>
<%}%>
<%out.print("
数据库操作成功,恭喜你");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>

posted @ 2008-12-17 16:47 sunny spring 阅读(305) | 评论 (0)编辑 收藏

Hibernate入门程序

       以下程序是Hiberante入门程序:代码如下:首先说hibernate开发流程.A、准备一个POJO类  B、创建类的映射和配置文件(hibernate.cfg.xml  class.hbm.xml)class.hbm.xml此配置文件是必须与POJO类中的属性一一对应.
现在我以我创建的程序为例来进行说明:数据库为demo,表的名字为admin
1、POJO类

package com.wch.pojo;

public class Admin {
 private int id;
 private String username;
 private String password;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
}

class.hbm.xml映射文件存放位置必须于POJO位置一致.也就是说必须放在同一个目录.hibernate.cfg.xml放在src根目录下.
2、创建hibernate.cfg.xml和class.hbm.xml(class指的是POJO类的名字)
class.hbm.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.wch.pojo.Admin" table="admin">
        <id name="id" type="integer">
            <column name="id" />
            <generator class="assigned"></generator>
        </id>
        <property name="username" type="string">
            <column name="username" length="32" not-null="false" />
        </property>
        <property name="password" type="string">
            <column name="password" length="20" not-null="false" />
        </property>
    </class>
</hibernate-mapping>
hibernate.cfg.xml:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
 <property name="dialect">
  org.hibernate.dialect.MySQLDialect
 </property>
 <property name="connection.url">
  jdbc:mysql://localhost:3306/demo
 </property>
 <property name="connection.username">root</property>
 <property name="connection.password">****</property>
 <property name="connection.driver_class">
  com.mysql.jdbc.Driver
 </property>
 <property name="myeclipse.connection.profile">mysql5.0</property>
 <property name="show_sql">true</property>
 <mapping resource="com/wch/pojo/Admin.hbm.xml" />

</session-factory>

</hibernate-configuration>


3、创建应用程序并进行代码测试:

package com.wch.op;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.wch.pojo.Admin;

public class UserOperation {
 public static void main(String[] args)throws Exception{
  Configuration config = new Configuration().configure();
  // 创建工厂
  SessionFactory factory = config.buildSessionFactory();
  // 打开session
  Session session = factory.openSession();
  // 事务提交
  try{
   Transaction tx = session.beginTransaction();
   // 创建对象
   Admin hb = new Admin();
   hb.setId(3);
   hb.setUsername("Hibernate3.2");
   hb.setPassword("20081202");
   //hb.setUsername("WCH");
   //hb.setPassword("Hibernate");
   // 执行插入语句,在hibernat中操作的是一个对象
   session.save(hb);
   // 提交事务
   tx.commit();
  }catch(Exception e)
  {
   System.out.println("error Msg:"+e.getMessage());
  }finally{
    // close session
    session.close();
  }
 }
}

更为详细的解释请参照Hibernate官方网站:www.hibernate.org


posted @ 2008-12-02 10:19 sunny spring 阅读(270) | 评论 (0)编辑 收藏

windows系统命令全集

ASSOC    显示或修改文件扩展名关联。
AT       计划在计算机上运行的命令和程序。
ATTRIB   显示或更改文件属性。
BREAK    设置或清除扩展式 CTRL+C 检查。
CACLS    显示或修改文件的访问控制列表(ACLs)。
CALL     从另一个批处理程序调用这一个。
CD       显示当前目录的名称或将其更改。
CHCP     显示或设置活动代码页数。
CHDIR    显示当前目录的名称或将其更改。
CHKDSK   检查磁盘并显示状态报告。
CHKNTFS  显示或修改启动时间磁盘检查。
CLS      清除屏幕。
CMD      打开另一个 Windows 命令解释程序窗口。
COLOR    设置默认控制台前景和背景颜色。
COMP     比较两个或两套文件的内容。
COMPACT  显示或更改 NTFS 分区上文件的压缩。
CONVERT  将 FAT 卷转换成 NTFS。您不能转换
         当前驱动器。
COPY     将至少一个文件复制到另一个位置。
DATE     显示或设置日期。
DEL      删除至少一个文件。
DIR      显示一个目录中的文件和子目录。
DISKCOMP 比较两个软盘的内容。
DISKCOPY 将一个软盘的内容复制到另一个软盘。
DOSKEY   编辑命令行、调用 Windows 命令并创建宏。
ECHO     显示消息,或将命令回显打开或关上。
ENDLOCAL 结束批文件中环境更改的本地化。
ERASE    删除至少一个文件。
EXIT     退出 CMD.EXE 程序(命令解释程序)。
FC       比较两个或两套文件,并显示
         不同处。
FIND     在文件中搜索文字字符串。
FINDSTR  在文件中搜索字符串。
FOR      为一套文件中的每个文件运行一个指定的命令。
FORMAT   格式化磁盘,以便跟 Windows 使用。
FTYPE    显示或修改用于文件扩展名关联的文件类型。
GOTO     将 Windows 命令解释程序指向批处理程序
         中某个标明的行。
GRAFTABL 启用 Windows 来以图像模式显示
         扩展字符集。
HELP     提供 Windows 命令的帮助信息。
IF       执行批处理程序中的条件性处理。
LABEL    创建、更改或删除磁盘的卷标。
MD       创建目录。
MKDIR    创建目录。
MODE     配置系统设备。
MORE     一次显示一个结果屏幕。
MOVE     将文件从一个目录移到另一个目录。
PATH     显示或设置可执行文件的搜索路径。
PAUSE    暂停批文件的处理并显示消息。
POPD     还原 PUSHD 保存的当前目录的上一个值。
PRINT    打印文本文件。
PROMPT   更改 Windows 命令提示符。
PUSHD    保存当前目录,然后对其进行更改。
RD       删除目录。
RECOVER  从有问题的磁盘恢复可读信息。
REM      记录批文件或 CONFIG.SYS 中的注释。
REN      重命名文件。
RENAME   重命名文件。
REPLACE  替换文件。
RMDIR    删除目录。
SET      显示、设置或删除 Windows 环境变量。
SETLOCAL 开始批文件中环境更改的本地化。
SHIFT    更换批文件中可替换参数的位置。
SORT     对输入进行分类。
START    启动另一个窗口来运行指定的程序或命令。
SUBST    将路径跟一个驱动器号关联。
TIME     显示或设置系统时间。
TITLE    设置 CMD.EXE 会话的窗口标题。
TREE     以图形模式显示驱动器或路径的目录结构。
TYPE     显示文本文件的内容。
VER      显示 Windows 版本。
VERIFY   告诉 Windows 是否验证文件是否已正确
         写入磁盘。
VOL      显示磁盘卷标和序列号。
XCOPY    复制文件和目录树。

posted @ 2008-12-01 15:58 sunny spring 阅读(245) | 评论 (0)编辑 收藏

quartz 详解

         最近在开发的过程中,经常要使用系统自动清零的操作,比如说:系统在给定的时间跟客户发送电子邮件,在指定的时间段内执行某些操作等等,如果我们只是人工去操作的话不但步骤非常的麻烦而且觉得这是一个工作量非常大的任务,有了quartz框架以后我们所有的任务多可以交给它去做,程序员唯一要做的只是编写代码并配置一下程序就OK了,这样大大提高了开发速度和工作效率.配置步骤如下:
1、编写quartz.properties文件:代码如下:
#============================================================================
# Configure Main Scheduler Properties 
#============================================================================
org.quartz.scheduler.instanceName = QuartzScheduler
org.quartz.scheduler.instanceId = AUTO
#org.quartz.scheduler.rmi.export = false
#org.quartz.scheduler.rmi.proxy = false
#============================================================================
# Configure ThreadPool 
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 4
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure Plugins
#============================================================================
#org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = /scheduler/quartz_job.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
2、编写quartz_job.xml
<?xml version='1.0' encoding='utf-8'?>
<quartz>
<job>
   <job-detail>
     <name>test</name>
     <group>DEFAULT</group>
     <description>testJobhere</description>
     <job-class>scheduler.TestJob</job-class>
     <job-data-map allows-transient-data="true">
      <entry>
       <key>name</key>
       <value>test</value>
      </entry>
    </job-data-map>
  </job-detail>
   <trigger>
              <cron>
                   <name>testCron</name>
                   <group>DEFAULT</group>
                   <job-name>test</job-name>
                  <job-group>DEFALUT</job-group>
                  <!--x/?  x表示间断启动时间  ?表示执行间隔时间  13启动时间-->
                  <cron-expression>0 1/2 23 * * ?</cron-expression>
                  <!--每月1号0点执行
                   <cron-expression>0 1 0 1 1-12 ?</cron-expression>
                   -->
              </cron>
        </trigger>
</job>
3、编写java代码进行测试:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class ZeroCount implements Job{
    public void execute(JobExecutionContext context) throws JobExecutionException
 {
    String name = context.getJobDetail().getJobDataMap().getString("name");
System.out.println(name);

}
}
出下以下结果表示配置成功:
test
4、此步骤是最后一步也是最重要的一步,只要加入如下代码的到/WEB-INF/web.xml文件中在指定的时间内就会执行系统调度.
<servlet>
    <servlet-name>QuartzInitializer</servlet-name>
    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
    <init-param>
     <param-name>config-file</param-name>
     <param-value>/quartz.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <init-param>
     <param-name>shutdown-on-unload</param-name>
     <param-value>true</param-value>
    </init-param>
    <init-param>
     <param-name>start-scheduler-on-load</param-name>
     <param-value>true</param-value>
    </init-param>
</servlet>

参考网站:http://www.iocblog.net/project/quartz.html

posted @ 2008-11-21 14:38 sunny spring 阅读(4501) | 评论 (2)编辑 收藏

struts1.0问题

16:14:10.437] {http--8888-7} java.lang.IllegalArgumentException: Resources cannot be null.
[16:14:10.437] {http--8888-7}  at org.apache.commons.validator.Validator.<init>(Validator.java:188)
[16:14:10.437] {http--8888-7}  at org.apache.struts.validator.Resources.initValidator(Resources.java:475)
[16:14:10.437] {http--8888-7}  at org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:104)
[16:14:10.437] {http--8888-7}  at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:928)
[16:14:10.437] {http--8888-7}  at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:204)
[16:14:10.437] {http--8888-7}  at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
[16:14:10.437] {http--8888-7}  at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
[16:14:10.437] {http--8888-7}  at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
[16:14:10.437] {http--8888-7}  at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
[16:14:10.437] {http--8888-7}  at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:103)
[16:14:10.437] {http--8888-7}  at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:187)
[16:14:10.437] {http--8888-7}  at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:266)
[16:14:10.437] {http--8888-7}  at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:270)
[16:14:10.437] {http--8888-7}  at com.caucho.server.port.TcpConnection.run(TcpConnection.java:678)
[16:14:10.437] {http--8888-7}  at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:721)
[16:14:10.437] {http--8888-7}  at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:643)
[16:14:10.437] {http--8888-7}  at java.lang.Thread.run(Thread.java:619)
以上错误是因为struts-config.xml文件中<form-beans>中form的路径不正确所致.

posted @ 2008-11-19 16:28 sunny spring 阅读(239) | 评论 (0)编辑 收藏

CSS 全解

CSS在英文中有如下几种常见的缩写:

1,Cascading Style Sheets 层叠样式表

2,Content Scrambling System DVD电影的加密系统

3,Cast Semi-Steel 半铸钢, 钢性铸铁

4,College Scholarship Service 大学奖学金处



其中在网络上最常见的是Cascading Style Sheets(层叠样式表)

感性体验CSS


什么是CSS呢?你可能急迫的想知道答案。但是空泛的文字描述意义不大,让我们先来一点感性体验吧。看看这个没有添加CSS的HTML文件:http://www.csszengarden.com/zengarden-sample.html
是一个普普通通的网页。然而通过给这个文件添加的CSS规则,我们可以得到十分美观的网页:http://www.csszengarden.com/

这还不是全部,不改动HTML,只是通过添加不同的CSS规则,我们就可以得到各种不同样式的网页:
http://www.csszengarden.com/?cssfile=/208/208.css&page=0
好了,下面我们再来回答什么是CSS这个问题。

什么是Cascading Style Sheets(层叠样式表)

* CSS是Cascading Style Sheets(层叠样式表)的简称.
* CSS语言是一种标记语言,它不需要编译,可以直接由浏览器执行(属于浏览器解释型语言).
* 在标准网页设计中CSS负责网页内容(XHTML)的表现.
* CSS文件也可以说是一个文本文件,它包含了一些CSS标记,CSS文件必须使用css为文件名后缀.
* 可以通过简单的更改CSS文件,改变网页的整体表现形式,可以减少我们的工作量,所以她是每一个网页设计人员的必修课.
* CSS是由W3C的CSS工作组产生和维护的.
如何将样式表加入到网页
可以用以下三种方式将样式表加入您的网页。而最接近目标的样式定义优先权越高。高优先权样式将继承低优先权样式的未重叠定义但覆盖重叠的定义。例外请参阅 !important 声明。

链入外部样式表文件 (Linking to a Style Sheet)
你可以先建立外部样式表文件(.css),然后使用HTML的link对象。示例如下:
<head>
<title>文档标题</title>
<link rel=stylesheet href="http://www.dhtmlet.com/dhtmlet.css" type="text/css">
</head>
而在XML中,你应该如下例所示在声明区中加入:
<? xml-stylesheet type="text/css" href="http://www.dhtmlet.com/dhtmlet.css" ?>

定义内部样式块对象 (Embedding a Style Block)
你可以在你的HTML文档的<HTML>和<BODY>标记之间插入一个<STYLE>...</STYLE>块对象。 定义方式请参阅样式表语法。示例如下:
<html>
<head>
<title>文档标题</title>
<style type="text/css">
<!--
body {font: 10pt "Arial"}
h1 {font: 15pt/17pt "Arial"; font-weight: bold; color: maroon}
h2 {font: 13pt/15pt "Arial"; font-weight: bold; color: blue}
p {font: 10pt/12pt "Arial"; color: black}
-->
</style>
</head>
<body>
请注意,这里将style对象的type属性设置为"text/css",是允许不支持这类型的浏览器忽略样式表单。

内联定义 (Inline Styles)
内联定义即是在对象的标记内使用对象的style属性定义适用其的样式表属性。示例如下:
这一行被增加了左右的外补丁


Cascading Style Sheets(层叠样式表)的历史
从1990年代初HTML被发明开始样式表就以各种形式出现了,不同的浏览器结合了它们各自的样式语言,读者可以使用这些样式语言来调节网页的显示方式。一开始样式表是给读者用的,最初的HTML版本只含有很少的显示属性,读者来决定网页应该怎样被显示。
但随着HTML的成长,为了满足设计师的要求,HTML获得了很多显示功能。随着这些功能的增加外来定义样式的语言越来越没有意义了。
1994年哈坤·利提出了CSS的最初建议。伯特·波斯(Bert Bos)当时正在设计一个叫做Argo的浏览器,他们决定一起合作设计CSS。
当时已经有过一些样式表语言的建议了,但CSS是第一个含有“层叠”的主意的。在CSS中,一个文件的样式可以从其它的样式表中继承下来。读者在有些地方可以使用他自己更喜欢的样式,在其他地方则继承,或“层叠”作者的样式。这种层叠的方式使作者和读者都可以灵活地加入自己的设计,混合各人的爱好。
哈坤于1994年在芝加哥的一次会议上第一次展示了CSS的建议,1995年他与波斯一起再次展示这个建议。当时W3C刚刚建立,W3C对CSS的发展很感兴趣,它为此组织了一次讨论会。哈坤、波斯和其他一些人(比如微软的托马斯·雷尔登)是这个项目的主要技术负责人。1996年底,CSS已经完成。1996年12月CSS要求的第一版本被出版。
1997年初,W3C内组织了专门管CSS的工作组,其负责人是克里斯·里雷。这个工作组开始讨论第一版中没有涉及到的问题,其结果是1998年5月出版的第二版要求。到2004年为止,第三版还未出版。

* 1996年W3C正式推出了CSS1.
* 1998年W3C正式推出了CSS2.
* CSS2.1是W3C现在正在推荐使用的.
* CSS3现在还处于开发中.

网页设计中常用的CSS属性

文字或元素的颜色 color
背景颜色 background-color
背景图像 background-image
字体 font-family
文字大小 font-size
列表样式 list
鼠标样式 cursor
边框样式 border
内补白 padding
外边距 margin
等...


CSS的语法:
  CSS的定义是由三个部分构成:
  选择符(selector),属性(properties)和属性的取值(value)。
  语法: selector {property: value} (选择符 {属性:值})
  说明:
  ·选择符是可以是多种形式,一般是你要定义样式的HTML标记,例如BODY、P、TABLE……,你可以通过此方法定义它的属性和值,属性和值要用冒号隔开:
  例子:body {color: black},此例的效果是使页面中的文字为黑色。
  ·如果属性的值是多个单词组成,必须在值上加引号,比如字体的名称经常是几个单词的组合:
  例子:p {font-family: "sans serif"} (定义段落字体为sans serif)
  · 如果需要对一个选择符指定多个属性时,我们使用分号将所有的属性和值分开:
  例子:p {text-align: center; color: red} (段落居中排列;并且段落中的文字为红色)
  2. 选择符组
  你可以把相同属性和值的选择符组合起来书写,用逗号将选择符分开,这样可以减少样式重复定义:
  h1, h2, h3, h4, h5, h6 { color: green } (这个组里包括所有的标题元素,每个标题元素的文字都为绿色)
  p, table{ font-size: 9pt } (段落和表格里的文字尺寸为9号字)
  效果完全等效于:
  p { font-size: 9pt }
  table { font-size: 9pt }
  3. 类选择符
  用类选择符你能够把相同的元素分类定义不同的样式,定义类选择符时,在自定类的名称前面加一个点号。假如你想要两个不同的段落,一个段落向右对齐,一个段落居中,你可以先定义两个类:
  p.right {text-align: right}
  p.center {text-align: center}
  然后用不在不同的段落里,只要在HTML标记里加入你定义的class参数:
  这个段落向右对齐的
  这个段落是居中排列的
  类选择符还有一种用法,在选择符中省略HTML标记名,这样可以把几个不同的元素定义成相同的样式:
  .center {text-align: center} (定义.center的类选择符为文字居中排列)
  这样的类可以被应用到任何元素上。下面我们使h1元素(标题1)和p元素(段落)都归为“center”类,这使两个元素的样式都跟随“.center”这个类选择符:
  <h1 class="center">这个标题是居中排列的</h1>
  这个段落也是居中排列的

  注意:这种省略HTML标记的类选择符是我们经后最常用的CSS方法,使用这种方法,我们可以很方便的在任意元素上套用预先定义好的类样式。
  4. ID选择符
  在HTML页面中ID参数指定了某个单一元素,ID选择符是用来对这个单一元素定义单独的样式。
  ID选择符的应用和类选择符类似,只要把CLASS换成ID即可。将上例中类用ID替代:
  这个段落向右对齐
  定义ID选择符要在ID名称前加上一个“#”号。和类选择符相同,定义ID选择符的属性也有两种方法。下面这个例子,ID属性将匹配所有id="intro"的元素:
  #intro
  {
  font-size:110%;
  font-weight:bold;
  color:#0000ff;
  background-color:transparent
  } (字体尺寸为默认尺寸的110%;粗体;蓝色;背景颜色透明)
  下面这个例子,ID属性只匹配id="intro"的段落元素:
  p#intro
  {
  font-size:110%;
  font-weight:bold;
  color:#0000ff;
  background-color:transparent
  }
  注意:ID选择符局限性很大,只能单独定义某个元素的样式,一般只在特殊情况下使用。
  5. 包含选择符
  可以单独对某种元素包含关系定义的样式表,元素1里包含元素2,这种方式只对在元素1里的元素2定义,对单独的元素1或元素2无定义,例如:
  table a
  {
  font-size: 12px
  }
  在表格内的链接改变了样式,文字大小为12象素,而表格外的链接的文字仍为默认大小。
  6. 样式表的层叠性
  层叠性就是继承性,样式表的继承规则是外部的元素样式会保留下来继承给这个元素所包含的其他元素。事实上,所有在元素中嵌套的元素都会继承外层元素指定的属性值,有时会把很多层嵌套的样式叠加在一起,除非另外更改。例如在DIV标记中嵌套P标记:
  div { color: red; font-size:9pt}
  ……
  这个段落的文字为红色9号字
  (P元素里的内容会继承DIV定义的属性)
  注意:有些情况下内部选择符不继承周围选择符的值,但理论上这些都是特殊的。例如,上边界属性值是不会继承的,直觉上,一个段落不会同文档BODY一样的上边界值。
  另外,当样式表继承遇到冲突时,总是以最后定义的样式为准。如果上例中定义了P的颜色:
  div { color: red; font-size:9pt}
  p {color: blue}
  ……
  这个段落的文字为蓝色9号字
  我们可以看到段落里的文字大小为9号字是继承div属性的,而color属性则依照最后定义的。
  不同的选择符定义相同的元素时,要考虑到不同的选择符之间的优先级。ID选择符,类选择符和HTML标记选择符,因为ID选择符是最后加上元素上的,所以优先级最高,其次是类选择符。如果想超越这三者之间的关系,可以用!important提升样式表的优先权,例如:
  p { color: #FF0000!important }
  .blue { color: #0000FF}
  #id1 { color: #FFFF00}
  我们同时对页面中的一个段落加上这三种样式,它最后会依照被!important申明的HTML标记选择符样式为红色文字。如果去掉!important,则依照优先权最高的ID选择符为黄色文字。
  
7. 注释:/* ... */
  你可以在CSS中插入注释来说明你代码的意思,注释有利于你或别人以后编辑和更改代码时理解代码的含义。在浏览器中,注释是不显示的。CSS注释以"/*" 开头,以"*/" 结尾,如下:
  /* 定义段落样式表 */
  p
  {
  text-align: center; /* 文本居中排列 */
  color: black; /* 文字为黑色 */
  font-family: arial /* 字体为arial */
  }



css可以用任何写文本的工具进行开发,如文本工具,dreamweaver开发
css也是一种语言,这种语言要和html或者xhtml语言相结合才起作用,
css简单来说就是用来美化网页用的,用css语言来控制网页的外观
举个例子
xhtml部分:
<ul>
<li>主页</li>
<li>留言</li>
<li>论坛</li>
</ul>
此时在页面上的表达形式是一个竖向列表,这样不够美观,
可以css来改善这个列表为一个横向导航条和超链接
css部分:
ul{list-style:none;margin:0px;padding:0px}
ul li{margin:0px;padding:0px;float:left;}
ul li a{display:block;width:100px;height:30px;background:#efefef;color:#333;text-decoration:none;text-align:center}
ul li a:hover{background:#333;color:#fff;}
添加上css后,这个列表变成横向的导航条了,超级链接是淡色背景,灰色字体,没有下划线,高度是30像素,宽度是100像素
当我们鼠标经过这个超级链接时候,变成灰色背景,白色字体


在主页制作时采用CSS技术,可以有效地对页面的布局、字体、颜色、背景和其它效果实现更加精确的控制。

只要对相应的代码做一些简单的修改,就可以改变同一页面的不同部分,或者页数不同的网页的外观和格式。

它的作用可以达到:

(1)在几乎所有的浏览器上都可以使用。

(2)以前一些非得通过图片转换实现的功能,现在只要用CSS就可以轻松实现,从而更快地下载页面。

(3)使页面的字体变得更漂亮,更容易编排,使页面真正赏心悦目。

(4)你可以轻松地控制页面的布局 。

(5)你可以将许多网页的风格格式同时更新,不用再一页一页地更新了。你可以将站点上所有的网页风格都使用一个CSS文件进行控制,只要修改这个CSS文件中相应的行,那么整个站点的所有页面都会随之发生变动。

想一想,没有使用CSS前我们是如何控制字体的颜色和大小以及所使用的字体的?我们一般使用HTML标签来实现,代码非常烦琐。

很难想象,如果在一个页面里需要频繁地更替字体的颜色大小,最终生成的HTML代码的长度一定臃肿不堪。

说实话,CSS就是为了简化这样的工作诞生的,当然其功能决非这么简单。

CSS是通过对页面结构的风格控制的思想,控制整个页面的风格的。

式样单放在页面中,通过浏览器的解释执行,是完全的文本,任何懂得HTML的人都可以掌握,非常的容易。甚至对一些非常老的浏览器,也不会产生页面混乱的现象。

CSS的一大优点是它的图片传输速度比较完全的HTML网页要快一点。

CSS:
Chinese,Surface-to-Surface
中国面对面导弹 简称CSS-N
CSS具有两面性。就像它在格式化文本、导航栏、图片以及其他小小的网页方面很棒一样,当你准备好布局完整的网页时,它真正可怕的一面也展现出来了。
CSS布局有两种风格——绝对定位和浮动。绝对定位让你把一个元素以像素级的精确性定位在网页的任何位置——或者理论上是这样。这种整体控制令人兴奋,就如你将在下一章中所看到的,但是实际上很难实现。这就是大量网页使用基于浮动的布局的原因,也是本章的主题。
CSS布局如何进行
How CSS Layout Works
如在第1章中讨论过的,HTML的局限性迫使设计师们去开发更聪明的方式来使他们的网页更美观。过去最常用的工具是[table]标签,它本是用来创建电子数据表——比如由数据行和列组成的信息显示表。但是设计师们却用HTML的表格来创建一种用来组织网页内容的脚手架(见图11-1)。可是由于[table]标签本来不是要用于布局的,因此设计师们不得不经常以各种不寻常的方式来使用这个标签——比如把一个表格放在另一个表格的单元里面——仅仅为了得到他们想要的效果。这种方法的工作量很大,增加了大量额外的HTML代码,并使得后面要修改设计很难。但是在CSS出现之前,那就是网页设计师们所拥有的一切办法。
如果你已经习惯于使用[table]标签,那么当你开始使用CSS进行布局时,必须发展一种新的思维。首先,忘掉行和列(运用表格时的一种重要的观念)。没有
列跨度、行跨度和格子状的表格结构在CSS中是找不到的。然而,你可以把一个标签当成一个表格单元。有了表格单元,标签就是把你要的内容定位在网页区域的一个逻辑位置。此外,如你所见,CSS设计经常把一个div嵌套在另一个div里面,就像你把表格嵌套在表格里面来获得特定的效果一样——但是,幸运的是,CSS方法只用少得多的HTML代码。
强大的标签
The Mighty   Tag
无论使用表格还是CSS,网页布局都是把大块的内容放进网页的不同区域里面。有了CSS,最常用来组织内容的元素就是标签。如第18页所述,标签是没有固有格式化属性的一个HTML元素(除了浏览器把这个标签当成前后有换行的块之外);反之,它被用来标识元素的一个逻辑组合或者网页中的一个分区。
你将代表性地把一大块属于一起的HTML包围在一个里面。图11-1中包含logo和导航栏的元素占据了网页顶部,因此用一个标签把它们包围起来很有意义。至少,你要给网页的所有主要区域包含标签,例如横幅、主要内容区域、工具条、页脚,等等。但是它也可能把一个或者更多的div包在一个里面。一种最常用的方法就是把<body>标签里面的HTML包在一个里面。然后可以通过把CSS应用到包装,设置基础的页面属性。你可以给网页内容设定一个整体的宽度,设置左边距和右边距,或者把所有网页内容在屏幕的中间居中。(在第313页的教程中,你有机会用到一个包装。)
一旦已经把标签放在了适当的位置上,再给每个标签添加一个类或者ID,变成你分别对每个定义样式的句柄。对于只出现一次和形成网页的基本构建块的网页部位,设计师们通常使用一个ID。一个网页横幅区域的标
签看起来可能像这样:。你可以对一个ID每页只使用一次,因此当有一个多次显示的元素时,就用一个类代替。如果你有几个定位照片和照片说明的div时,可以创建一个样式像这样:。
有了类似这些的样式,就可以定位各种各样的网页元素了。利用CSS的float属性,你可以定位不同的内容块给一张网页的左边或者右边(或者一个包含块比如另一个的左边或者右边)。
至理名言
更多并非更好
虽然div对于CSS布局很重要,但也别对你的网页滥用div。一个常见的陷阱是相信你必须把一张网页中的一切都包围在一个标签里面。假设你的主导航栏是一个链接的无序列表
(就像第218页中所述)。由于它是一个重要的元素,你可能会试探用一个来把它围起来:<ul>...</ul>
。但是当<ul>标签唾手可得时,就没有必要去添加一个了。只要<ul>包含主要的导航栏链接,就只需添加ID样式给这个标签:<ul id= "mainNav">。多余的只是一些没有必要的代码。

posted @ 2008-06-30 11:22 sunny spring 阅读(345) | 评论 (0)编辑 收藏

jspSmartUpload上传下载全攻略

一、安装篇

  jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。该组件有以下几个特点:

1、使用简单。在JSP文件中仅仅书写三五行JAVA代码就可以搞定文件的上传或下载,方便。

2、能全程控制上传。利用jspSmartUpload组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取。

3、能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件。

4、下载灵活。仅写两行代码,就能把Web服务器变成文件服务器。不管文件在Web服务器的目录下或在其它任何目录下,都可以利用jspSmartUpload进行下载。

5、能将文件上传到数据库中,也能将数据库中的数据下载下来。这种功能针对的是MYSQL数据库,因为不具有通用性,所以本文不准备举例介绍这种用法。

  jspSmartUpload组件可以从http://www.edufans.com/html/JSP/JSP_down/2006/200610054829.html网站上自由下载,压缩包的名字是jspSmartUpload.zip。下载后,用WinZip或WinRAR将其解压到Tomcat的webapps目录下(本文以Tomcat服务器为例进行介绍)。解压后,将webapps/jspsmartupload目录下的子目录Web-inf名字改为全大写的WEB-INF,这样一改jspSmartUpload类才能使用。因为Tomcat对文件名大小写敏感,它要求Web应用程序相关的类所在目录为WEB-INF,且必须是大写。接着重新启动Tomcat,这样就可以在JSP文件中使用jspSmartUpload组件了。

  注意,按上述方法安装后,只有webapps/jspsmartupload目录下的程序可以使用jspSmartUpload组件,如果想让Tomcat服务器的所有Web应用程序都能用它,必须做如下工作:

1.进入命令行状态,将目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下。

2.运行JAR打包命令:jar cvf jspSmartUpload.jar com

(也可以打开资源管理器,切换到当前目录,用WinZip将com目录下的所有文件压缩成jspSmartUpload.zip,然后将jspSmartUpload.zip换名为jspSmartUpload.jar文件即可。)

3.将jspSmartUpload.jar拷贝到Tomcat的shared/lib目录下。

二、相关类说明篇

File类

  这个类包装了一个上传文件的所有信息。通过它,可以得到上传文件的文件名、文件大小、扩展名、文件数据等信息。

  File类主要提供以下方法:

1、saveAs作用:将文件换名另存。

原型:

public void saveAs(java.lang.String destFilePathName)



public void saveAs(java.lang.String destFilePathName, int optionSaveAs)

其中,destFilePathName是另存的文件名,optionSaveAs是另存的选项,该选项有三个值,分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUAL,SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件,SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件,SAVEAS_AUTO则表示让组件决定,当Web应用程序的根目录存在另存文件的目录时,它会选择SAVEAS_VIRTUAL,否则会选择SAVEAS_PHYSICAL。

例如,saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘,则另存的文件名实际是c:uploadsample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用程序的根目录是webapps/jspsmartupload,则另存的文件名实际是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)执行时若Web应用程序根目录下存在upload目录,则其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL),否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)。

建议:对于Web程序的开发来说,最好使用SAVEAS_VIRTUAL,以便移植。

2、isMissing

作用:这个方法用于判断用户是否选择了文件,也即对应的表单项是否有值。选择了文件时,它返回false。未选文件时,它返回true。

原型:public boolean isMissing()

3、getFieldName

作用:取HTML表单中对应于此上传文件的表单项的名字。

原型:public String getFieldName()

4、getFileName

作用:取文件名(不含目录信息)

原型:public String getFileName()

5、getFilePathName

作用:取文件全名(带目录)

原型:public String getFilePathName

6、getFileExt

作用:取文件扩展名(后缀)

原型:public String getFileExt()

7、getSize

作用:取文件长度(以字节计)

原型:public int getSize()

8、getBinaryData

作用:取文件数据中指定位移处的一个字节,用于检测文件等处理。

原型:public byte getBinaryData(int index)。其中,index表示位移,其值在0到getSize()-1之间。

Files类

  这个类表示所有上传文件的集合,通过它可以得到上传文件的数目、大小等信息。有以下方法:

1、getCount

作用:取得上传文件的数目。

原型:public int getCount()

2、getFile

作用:取得指定位移处的文件对象File(这是com.jspsmart.upload.File,不是java.io.File,注意区分)。

原型:public File getFile(int index)。其中,index为指定位移,其值在0到getCount()-1之间。

3、getSize

作用:取得上传文件的总长度,可用于限制一次性上传的数据量大小。

原型:public long getSize()

4、getCollection

作用:将所有上传文件对象以Collection的形式返回,以便其它应用程序引用,浏览上传文件信息。

原型:public Collection getCollection()

5、getEnumeration

作用:将所有上传文件对象以Enumeration(枚举)的形式返回,以便其它应用程序浏览上传文件信息。

原型:public Enumeration getEnumeration()

Request类

  这个类的功能等同于JSP内置的对象request。只所以提供这个类,是因为对于文件上传表单,通过request对象无法获得表单项的值,必须通过jspSmartUpload组件提供的Request对象来获取。该类提供如下方法:

1、getParameter

作用:获取指定参数之值。当参数不存在时,返回值为null。

原型:public String getParameter(String name)。其中,name为参数的名字。

2、getParameterValues

作用:当一个参数可以有多个值时,用此方法来取其值。它返回的是一个字符串数组。当参数不存在时,返回值为null。

原型:public String[] getParameterValues(String name)。其中,name为参数的名字。

3、getParameterNames

作用:取得Request对象中所有参数的名字,用于遍历所有参数。它返回的是一个枚举型的对象。

原型:public Enumeration getParameterNames()
㈣ SmartUpload类这个类完成上传下载工作。

A.上传与下载共用的方法:

只有一个:initialize。

作用:执行上传下载的初始化工作,必须第一个执行。

原型:有多个,主要使用下面这个:

public final void initialize(javax.servlet.jsp.PageContext pageContext)

其中,pageContext为JSP页面内置对象(页面上下文)。

B.上传文件使用的方法:

1、upload

作用:上传文件数据。对于上传操作,第一步执行initialize方法,第二步就要执行这个方法。

原型:public void upload()

2、save

作用:将全部上传文件保存到指定目录下,并返回保存的文件个数。

原型:public int save(String destPathName)

和public int save(String destPathName,int option)

其中,destPathName为文件保存目录,option为保存选项,它有三个值,分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。(同File类的saveAs方法的选项之值类似)SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下,SAVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下,而SAVE_AUTO则表示由组件自动选择。

注:save(destPathName)作用等同于save(destPathName,SAVE_AUTO)。

3、getSize

作用:取上传文件数据的总长度

原型:public int getSize()

4、getFiles

作用:取全部上传文件,以Files对象形式返回,可以利用Files类的操作方法来获得上传文件的数目等信息。

原型:public Files getFiles()

5、getRequest

作用:取得Request对象,以便由此对象获得上传表单参数之值。

原型:public Request getRequest()

6、setAllowedFilesList

作用:设定允许上传带有指定扩展名的文件,当上传过程中有文件名不允许时,组件将抛出异常。

原型:public void setAllowedFilesList(String allowedFilesList)

其中,allowedFilesList为允许上传的文件扩展名列表,各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文件,可以用两个逗号表示。例如:setAllowedFilesList("doc,txt,,")将允许上传带doc和txt扩展名的文件以及没有扩展名的文件。

7、setDeniedFilesList

作用:用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限制,则上传时组件将抛出异常。

原型:public void setDeniedFilesList(String deniedFilesList)

其中,deniedFilesList为禁止上传的文件扩展名列表,各个扩展名之间以逗号分隔。如果想禁止上传那些没有扩展名的文件,可以用两个逗号来表示。例如:setDeniedFilesList("exe,bat,,")将禁止上传带exe和bat扩展名的文件以及没有扩展名的文件。

8、setMaxFileSize

作用:设定每个文件允许上传的最大长度。

原型:public void setMaxFileSize(long maxFileSize)

其中,maxFileSize为为每个文件允许上传的最大长度,当文件超出此长度时,将不被上传。

9、setTotalMaxFileSize

作用:设定允许上传的文件的总长度,用于限制一次性上传的数据量大小。

原型:public void setTotalMaxFileSize(long totalMaxFileSize)

其中,totalMaxFileSize为允许上传的文件的总长度。

C.下载文件常用的方法

1、setContentDisposition

作用:将数据追加到MIME文件头的CONTENT-DISPOSITION域。jspSmartUpload组件会在返回下载的信息时自动填写MIME文件头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,请用此方法。

原型:public void setContentDisposition(String contentDisposition)

其中,contentDisposition为要添加的数据。如果contentDisposition为null,则组件将自动添加"attachment;",以表明将下载的文件作为附件,结果是IE浏览器将会提示另存文件,而不是自动打开这个文件(IE浏览器一般根据下载的文件扩展名决定执行什么操作,扩展名为doc的将用word程序打开,扩展名为pdf的将用acrobat程序打开,等等)。

2、downloadFile

作用:下载文件。

原型:共有以下三个原型可用,第一个最常用,后两个用于特殊情况下的文件下载(如更改内容类型,更改另存的文件名)。

① public void downloadFile(String sourceFilePathName)

其中,sourceFilePathName为要下载的文件名(带目录的文件全名)

② public void downloadFile(String sourceFilePathName,String contentType)

其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别)。

③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName)

其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别),destFileName为下载后默认的另存文件名。

三、文件上传篇

㈠ 表单要求

对于上传文件的FORM表单,有两个要求:

1、METHOD应用POST,即METHOD="POST"。

2、增加属性:ENCTYPE="multipart/form-data"

下面是一个用于上传文件的FORM表单的例子:

<FORM METHOD="POST" ENCTYPE="multipart/form-data"
            ACTION="/jspSmartUpload/upload.jsp">
            <INPUT TYPE="FILE" NAME="MYFILE">
            <INPUT TYPE="SUBMIT">
            </FORM>


㈡ 上传的例子

1、上传页面upload.html

本页面提供表单,让用户选择要上传的文件,点击"上传"按钮执行上传操作。

页面源码如下:

<!--
            文件名:upload.html
            作  者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com)
            -->
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
            <html>
            <head>
            <title>文件上传</title>
            <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
            </head>
            <body>
            <p>&nbsp;</p>
            <p align="center">上传文件选择</p>
            <FORM METHOD="POST" ACTION="jsp/do_upload.jsp"
            ENCTYPE="multipart/form-data">
            <input type="hidden" name="TEST" value="good">
            <table width="75%" border="1" align="center">
            <tr>
            <td><div align="center">1、
            <input type="FILE" name="FILE1" size="30">
            </div></td>
            </tr>
            <tr>
            <td><div align="center">2、
            <input type="FILE" name="FILE2" size="30">
            </div></td>
            </tr>
            <tr>
            <td><div align="center">3、
            <input type="FILE" name="FILE3" size="30">
            </div></td>
            </tr>
            <tr>
            <td><div align="center">4、
            <input type="FILE" name="FILE4" size="30">
            </div></td>
            </tr>
            <tr>
            <td><div align="center">
            <input type="submit" name="Submit" value="上传它!">
            </div></td>
            </tr>
            </table>
            </FORM>
            </body>
            </html>


2、上传处理页面do_upload.jsp

本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法,在此不赘述了。

页面源码如下:

<%--
            文件名:do_upload.jsp
            作  者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com)
            --%>
            <%@ page contentType="text/html; charset=gb2312" language="java"
            import="java.util.*,com.jspsmart.upload.*" errorPage="" %>
            <html>
            <head>
            <title>文件上传处理页面</title>
            <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
            </head>
            <body>
            <%
            // 新建一个SmartUpload对象
            SmartUpload su = new SmartUpload();
            // 上传初始化
            su.initialize(pageContext);
            // 设定上传限制
            // 1.限制每个上传文件的最大长度。
            // su.setMaxFileSize(10000);
            // 2.限制总上传数据的长度。
            // su.setTotalMaxFileSize(20000);
            // 3.设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。
            // su.setAllowedFilesList("doc,txt");
            // 4.设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,
            jsp,htm,html扩展名的文件和没有扩展名的文件。
            // su.setDeniedFilesList("exe,bat,jsp,htm,html,,");
            // 上传文件
            su.upload();
            // 将上传文件全部保存到指定目录
            int count = su.save("/upload");
            out.println(count+"个文件上传成功!<br>");
            // 利用Request对象获取参数之值
            out.println("TEST="+su.getRequest().getParameter("TEST")
            +"<BR><BR>");
            // 逐一提取上传文件信息,同时可保存文件。
            for (int i=0;i<su.getFiles().getCount();i++)
            {
            com.jspsmart.upload.File file = su.getFiles().getFile(i);
            // 若文件不存在则继续
            if (file.isMissing()) continue;
            // 显示当前文件信息
            out.println("<TABLE BORDER=1>");
            out.println("<TR><TD>表单项名(FieldName)</TD><TD>"
            + file.getFieldName() + "</TD></TR>");
            out.println("<TR><TD>文件长度(Size)</TD><TD>" +
            file.getSize() + "</TD></TR>");
            out.println("<TR><TD>文件名(FileName)</TD><TD>"
            + file.getFileName() + "</TD></TR>");
            out.println("<TR><TD>文件扩展名(FileExt)</TD><TD>"
            + file.getFileExt() + "</TD></TR>");
            out.println("<TR><TD>文件全名(FilePathName)</TD><TD>"
            + file.getFilePathName() + "</TD></TR>");
            out.println("</TABLE><BR>");
            // 将文件另存
            // file.saveAs("/upload/" + myFile.getFileName());
            // 另存到以WEB应用程序的根目录为文件根目录的目录下
            // file.saveAs("/upload/" + myFile.getFileName(),
            su.SAVE_VIRTUAL);
            // 另存到操作系统的根目录为文件根目录的目录下
            // file.saveAs("c:\\temp\\" + myFile.getFileName(),
            su.SAVE_PHYSICAL);
            }
            %>
            </body>
            </html>


四、文件下载篇

1、下载链接页面download.html

页面源码如下:

<!--
            文件名:download.html
            作  者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com)
            -->
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
            <html>
            <head>
            <title>下载</title>
            <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
            </head>
            <body>
            <a href="jsp/do_download.jsp">点击下载</a>
            </body>
            </html>


2、下载处理页面do_download.jsp do_download.jsp展示了如何利用jspSmartUpload组件来下载文件,从下面的源码中就可以看到,下载何其简单。

源码如下:

<%@ page contentType="text/html;charset=gb2312"
            import="com.jspsmart.upload.*" %><%
            // 新建一个SmartUpload对象
            SmartUpload su = new SmartUpload();
            // 初始化
            su.initialize(pageContext);
            // 设定contentDisposition为null以禁止浏览器自动打开文件,
            //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
            //doc时,浏览器将自动用word打开它。扩展名为pdf时,
            //浏览器将用acrobat打开。
            su.setContentDisposition(null);
            // 下载文件
            su.downloadFile("/upload/如何赚取我的第一桶金.doc");
            %>


注意,执行下载的页面,在Java脚本范围外(即<% ... %>之外),不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。不信的话,可以在上述源码中%><%之间加入一个换行符,再下载一下,保证出错。因为它影响了返回给浏览器的数据流,导致解析出错。

3、如何下载中文文件

jspSmartUpload虽然能下载文件,但对中文支持不足。若下载的文件名中有汉字,则浏览器在提示另存的文件名时,显示的是一堆乱码,很扫人兴。上面的例子就是这样。(这个问题也是众多下载组件所存在的问题,很少有人解决,搜索不到相关资料,可叹!)

为了给jspSmartUpload组件增加下载中文文件的支持,我对该组件进行了研究,发现对返回给浏览器的另存文件名进行UTF-8编码后,浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对jspSmartUpload组件的SmartUpload类做了升级处理,增加了toUtf8String这个方法,改动部分源码如下:

public void downloadFile(String s, String s1, String s2, int i)
            throws ServletException, IOException, SmartUploadException
            {
            if(s == null)
            throw new IllegalArgumentException("File '" + s +
            "' not found (1040).");
            if(s.equals(""))
            throw new IllegalArgumentException("File '" + s +
            "' not found (1040).");
            if(!isVirtual(s) && m_denyPhysicalPath)
            throw new SecurityException("Physical path is
            denied (1035).");
            if(isVirtual(s))
            s = m_application.getRealPath(s);
            java.io.File file = new java.io.File(s);
            FileInputStream fileinputstream = new FileInputStream(file);
            long l = file.length();
            boolean flag = false;
            int k = 0;
            byte abyte0[] = new byte[i];
            if(s1 == null)
            m_response.setContentType("application/x-msdownload");
            else
            if(s1.length() == 0)
            m_response.setContentType("application/x-msdownload");
            else
            m_response.setContentType(s1);
            m_response.setContentLength((int)l);
            m_contentDisposition = m_contentDisposition != null ?
            m_contentDisposition : "attachment;";
            if(s2 == null)
            m_response.setHeader("Content-Disposition",
            m_contentDisposition + " filename=" +
            toUtf8String(getFileName(s)));
            else
            if(s2.length() == 0)
            m_response.setHeader("Content-Disposition",
            m_contentDisposition);
            else
            m_response.setHeader("Content-Disposition",
            m_contentDisposition + " filename=" + toUtf8String(s2));
            while((long)k < l)
            {
            int j = fileinputstream.read(abyte0, 0, i);
            k += j;
            m_response.getOutputStream().write(abyte0, 0, j);
            }
            fileinputstream.close();
            }
            /**
            * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
            * 纵横软件制作中心雨亦奇2003.08.01
            * @param s 原文件名
            * @return 重新编码后的文件名
            */
            public static String toUtf8String(String s) {
            StringBuffer sb = new StringBuffer();
            for (int i=0;i<s.length();i++) {
            char c = s.charAt(i);
            if (c >= 0 && c <= 255) {
            sb.append(c);
            } else {
            byte[] b;
            try {
            b = Character.toString(c).getBytes("utf-8");
            } catch (Exception ex) {
            System.out.println(ex);
            b = new byte[0];
            }
            for (int j = 0; j < b.length; j++) {
            int k = b[j];
            if (k < 0) k += 256;
            sb.append("%" + Integer.toHexString(k).
            toUpperCase());
            }
            }
            }
            return sb.toString();
            }


注意源码中粗体部分,原jspSmartUpload组件对返回的文件未作任何处理,现在做了编码的转换工作,将文件名转换为UTF-8形式的编码形式。UTF-8编码对英文未作任何处理,对中文则需要转换为%XX的形式。toUtf8String方法中,直接利用Java语言提供的编码转换方法获得汉字字符的UTF-8编码,之后将其转换为%XX的形式。

将源码编译后打包成jspSmartUpload.jar,拷贝到Tomcat的shared/lib目录下(可为所有WEB应用程序所共享),然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另,toUtf8String方法也可用于转换含有中文的超级链接,以保证链接的有效,因为有的WEB服务器不支持中文链接。

小结:jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件,它使用简单,方便。现在我又为其加上了下载中文名字的文件的支持,真个是如虎添翼,必将赢得更多开发者的青睐。

posted @ 2008-06-30 11:21 sunny spring 阅读(306) | 评论 (0)编辑 收藏

JavaScript

  1. 状态栏 (statusbar)显功能
  2. 日期物件
  3. 随数的产生
  4. 开启新窗囗

范 例 5:

在 这 一 部 分 首 先 要 为 你 展 示 的 JavaScript 特 性 是 将 你 的 滑 鼠 移 到 这 个 不 同 颜 色

连 结上 面, 此 时 看 看 浏 览 器 下 的 状 态 列 有 何 结 果。 然 後 这 样 的 功 能 我 们 可 以

与 JavaScript 的 功 能 相 结 合。 好, 现 在 再 将 你 的 滑 鼠 移 到 本 处 不 同 颜 色 的连 结

面, 你 应 该 会 发 现 有 一 个 视 窗 出 现, 是 吧?! 如 何! 怎 麽 做 到 的 呢? 以 下 就 是

这 一 个 连 结 的 作 法:

<a href="tpage.htm" onMouseOver="window.status='Just another stupid link...'; return true">
在 这 儿 你 只 要 在 传 统 <a> 的 标 签 中 加 入 onMouseOver 的 method, 就 可 达 成 你 要 的

效 果 了。 这 里 的 window.status 是 用 来 让 你 可 以 在 WWW 浏 览 器 的 状 态 列 上 显 示

一 些 讯 息 用 的。 在 语 法 中, 你 可 以 看 到 讯 息 部 分 是 用 ' 括 起 来 的 部 分, 而 非 以 " 括

起 来, 在 讯 息 部 分 结 束 之 後, 必 须 加 上 ; return true

好 了, 利 用 以 上 的 特 性 可 以 很 简 单 的 完 成 第 二 个 连 结 的 例 子! 相 当 简 单, 以

onMouseOver 的 method 然 後 配 合 事 件 发 生 时 去 呼 叫 函 数 hello() 就 行 了, 不 再

多 加 解 释 了, 作 法 如 下:

<html>
<head>
<script language="LiveScript">
<!-- Hiding
function hello() {
alert("哈 罗!");
}
</script>
</head>
<body>
<a href="" onMouseOver="hello()">link</a>
</body>
</html>


范 例 6:

接 下 来 我 们 要 告 诉 你 一 个 使 用 日 期 和 时 间 的 例 子。 在 第 一 部 分 中, 你 已 看 过 了

lastModified 的 用 法 和 作 法。 现 在 要 告 诉 你 的 并 非 是 印 出 网 路 上 伺 服 器 或 文 件

修 改 日 期, 而 是 你 个 人 客 户 端 机 器 的 日 期 和 时 间。 以 下 就 是 执 行 结 果:

现 在 时 间 是: 14:4
今 天 日 期 为: 6/3/2008

做 法 如 下:

<script language="LiveScript">
<!-- Hiding
today = new Date()
document.write("现 在 时 间 是: ",today.getHours(),":",today.getMinutes())
document.write("<br>今 天 日 期 为: ", today.getMonth()+1,"/",today.getDate(),"/",today.getYear());
// end hiding contents -->
</script>
在 本 例 中, 我 们 必 需 首 先 建 立 一 个 日 期 变 数, 这 可 以 由 today= new Date()来 完 成。

如 果 没 有 特 别 指 定 时 间 与 日 期 的 话, 浏 览 器 将 会 采 用 本 地 客 户 端 机 器 的 时 间, 若 将

它 放 入 变 数 today 中。 这 儿 要 注 意 的 是: 我 们 并 没 有 宣 告 today 这 个 变 数 的 型 态,

这 和 Java 或 其 他 的 程 式 语 言 在 用 到 变 数 之 前 必 需 先 加 以 宣 告 的 方 式 有 相 当 大 的 不

同。 在 完 成 today 的 日 期 变 数 後, 我 们 等 於 建 立 了 一 个 具 有 本 地 时 间 与 日 期 的 物 件

(object)。 接 着 就 可 以 使 用 get... 的 method 以 取 得 today 这 个 物 件 的 时 间 和 日 期。

请 注 意 getMonth 这 个 method 所 取 得 的 月 份 范 围 是 由 0~11, 所 以 必 须 加 1 以 代

表 真 正 的 1 月 至 12 月。 看 完 以 上 的 例 子 後, 想 想 你 可 以 使 你 的 文 件 变 得 有 点

智 慧, 例 如: 某 个 文 件 有 时 效 限 制 的 话, 你 可 以 利 用 我 们 在 上 一 部 份 的范 例 4

中 所 提 到 的 功 能 和 这 一 个 范 例 中 所 学 习 到 的 功 能, 设 计 一 个 让 你 的 文 件 在 第10天

以 後 读 到 的 话 就 会 告 诉 读 者:"喂! 这 篇 已 过 时 了!"的 程 式, 试 试 看, 并 不 难!


除 以 上 功 能 外, 在 建 立 日 期 物 件 时 你 也 可 以 事 先 设 定 日 期 如 下:

docStarted= new Date(96,0,13)

首 先 是 年(西 元), 接 着 是 月(但 记 得 减 1), 再 接 着 是 日。 同 样 的 方 法 也 可 以

加 上 时 间 的 设 定, 如 下:

docStarted = new Date(96,0,13,10,50,0)

前 三 个 是 日 期 的 年、 月、 日, 接 着 是 时、 分、 秒。 最 後, 我 们 必 须 提 醒 你,

JavaScript 并 没 有 实 际 的 日 期 型 态, 但 是 它 却 能 毫 不 费 力 地 显 示 出 日 期 和 时 间,

原 因 是 它 是 从 1 / 1 / 1970 0:0h 开 始 以 ms(milli seconds) 来 计 算 目 前 的 时 间 的,

这 听 起 来 似   有 些 复 杂, 但 你 倒 不 用 担 心, 它 有 标 准 的 共 用 函 数 可 以 计 算,

你 只 要 知 道 如 何 用 就 可 以 了!


范 例 7:

接 下 来 我 们 要 为 你 介 绍 一 个 可 以 产 生 乱 数 的 函 数, 也 是 以 JavaScript 所 写 的。

这 个 函 数 只 是 利 用 了 一 点 小 技 巧 而 已, 而 这 种 技 巧 在 大 部 分 的 编 译 器(compiler)中,

大 都 是 如 此(或 类 似) 计 算 出 乱 数 来 的。 我 相 信 JavaScript 最 後 应 也 会 以 相 似 的 方

法 来 产 生 这 样 的 method , 如 果 它 会 提 供 这 样 功 能 的 话。 以 下 是 此 函 数 的 结 果:

这 是 一 个 计 算 产 生 的 乱 数: 0.9836312285070992

以 下 是 这 个 作 法 的 写 法:

<html>
<head>
<script language="LiveScript">
function RandomNumber() {
today = new Date();
num = Math.abs(Math.sin(today.getTime()));
return num;
}
</script>
</head>
<body>
<script language="LiveScript">
<!--
document.write("This is a random number:", RandomNumber());
// -->
</script>
</body>
</html>

我 们 的 做 法 是 以 上 一 个 范 例 中 的 时 间 函 数; 它 会 出 现 一 个 很 大 的 数,

利 用 这 个 数 再 加 以 运 算 即 可! 例 如: 将 它 拿 来 做 正 弦 函 数(sin) 的 运

算, 得 到 的 数 再 做 绝 对 值 的 运 算, 结 果 可 以 得 到 一 个 介 於 0 与 1 间 的

实 数。 因 为 时 间 的 改 变 是 ms 为 单 位, 而 且 你 绝 不 会 获 得 相 同 的 数 字。

不 过 这 个 做 法 并 不 适 合 拿 来 快 速 的 连 续 产 生 一 系 列 的 乱 数, 但 如 果 你

是 不 定 时, 久 久 的 用 一 次, 那 效 果 就 不 错 了!


范 例 8:

JavaScript 的 一 个 重 要 特 点 是 它 可 以 制 作 视 窗。 你 可 以 产 生 一 个 的 视 窗, 并 且

在 此 视 窗 中 载 入 HTML 文 件, 完 全 以 JavaScript 来 航 游 网 际 网 路(Internet )。

接 下 来 的 范 例 就 是 告 诉 你 如 何 开 启 一 个 视 窗 并 且 写 点 东 西 进 去, 你 可 先 试 试

按 一 下 范 中 之 接 钮 看 看!

原 始 程 式 如 下:

<html>
<head>
<script language="LiveScript">
function WinOpen() {
msg=open("","DisplayWindow","toolbar=no,directories=no,menubar=no");
msg.document.write("<HEAD><TITLE>哈 罗!</TITLE></HEAD>");
msg.document.write("<CENTER><H1>酷 毙 了!</H1><h2>这 是<B>JavaScript</B>所 开 的 视 窗!</h2></CENTER>");
}
</script>
</head>
<body>
<form>
<input type="button" name="Button1" value="Push me" onclick="WinOpen()">
</form>
</body>
</html>
这 儿 你 又 看 到 用 按 钮 来 启 动 函 数。 这 次 的 函 数 WinOpen()是 藉 着 一 个 open

的 method 来 产 生 一 个 新 的 视 窗。 第 一 对 双 引 号("")是 用 来 描 述 欲 载 入 至 视 窗

中 的 文 件 URL 位 置。 如 果 留 者 空 白 的 话, 那 就 会 呈 现 一 个 空 白 视 窗, 并 可 以

透 过 JavaScript 写 入 东 西! 下 一 对 双 引 号 内 的 内 容 是 这 个 新 开 启 视 窗 的 名 字,

你 可 以 喜 欢 给 它 任 意 一 个 名 字, 但 不 可 加 入 空 白, 如 用 Display Window 的 话 便

会 出 现 错 误 讯 息, 请 注 意。 接 下 来 的 一 连 串 双 引 号 内 所 指 定 的 是 该 视 窗

的 相 关 性 质(properties), 这 些 蛮 有 趣 的, 你 可 以 指 定 要 不 要 有 工 具 棒(toolbar) 、

卷 轴(scrollbar), 等 等, 例 如: 如 果 你 写 toolbar = yes, 那 就 会 在 你 所 产 生 出

来 的 视 窗 中 出 现 一 排 工 具 列。 以 下 有 许 多 你 可 以 改 变 的 视 窗 特 性, 请 注 意 它 们

字 中 间 不 可 以 有 空 白:

toolbar
location
directories
status
menubar
scrollbars
resizable
copyhistory
width=pixels
height=pixels

以 上 的 pixels 部 分, 你 可 以 填 入 点 数 的 数 值, 这 数 值 是 告 诉 浏 览 器 这 个 视 窗 的

大 小。 在 开 启 视 窗, 并 且 将 它 称 为 msg 以 後, 就 可 以 开 始 写 些 东 西 到 视 窗 中 了。

你 可 以 写 入 一 般 正 规 的 HTML 语 法 文 字。 哇! 这 可 不 得 了 了, 也 就 是 说, 你 可 以

利 用 先 前 使 用 者 在 form 表 格 中 输 入 给 你 的 文 章 直 接 将 它 回 应 至 浏 览 器 上 来 了! 这 些

功 能 在 几 个 月 前 大 概 还 只 能 用 CGI 才 能 达 到 喔! 现 在 你 不 用 CGI 也 可 以 做 了!


  1. 什麽是JavaScript?
  2. 执行 JavaScript scripts
  3. 将scripts 语法嵌入HTML文件之中
  4. 第一个函数
  5. 输入型元件
  6. 日期功能 -- 最後修改期

JavaScript 是一种新的描述语言,此一语言可以被箝入 HTML 的文件之中。

透过 JavaScript 可以做到回应使用者的需求事件 (如: form 的输入) 而不用任何的网路

来回传输资料,所以当一位使用者输入一项资料时,它不用经过传给伺服端 (server)

处理,再传回来的过程,而直接可以被客户端 (client) 的应用程式所处理。你也可

以想像成有一个可执行程式在你的客端上执行一样!目前已有一些写好的程式在

Internet 上你可以连过去看看,以下有一些计算器的例子,在 Nescape 上。


JavaScript 和 Java 很类似,但到底并不一样! Java 是一种比 JavaScript 更复杂

许多的程式语言,而 JavaScript 则是相当容易了解的语言。JavaScript 创作者

可以不那麽注重程式技巧,所以许多 Java 的特性在 Java Script 中并不支援。

如需相关的更多资讯,可以去读读 Netscape 的有关 Netscape JavaScript 之介绍。


 

如何执行 JaveScript? 范例 1:

JavaScript 如何执行呢?

Netscape 2.0 beta 3 版以上,就可以执行 JavaScript 的功能了,我们测试过至少

beta 3 版以上可以,其他种类的 WWW 浏览器如:Internet Expore 3.0也有此一功能。


 

以下我们就以一些例子来告诉你如何将 JavaScript 写在 HTML 文件中,并且体会

一下新语言的特性,我们从第一个例子开始:如何用 JavaScript 印出一串文字至

HTML 文件中:

<html>
<head>
My first JavaScript!
</head>
<body>
<br>
This is a normal HTML document.
<br>
<script language="LiveScript">
document.write("这是以 JavaScript 印出的!")
</script>
<br>
Back in HTML again.
</body>
</html>

如果你使用的 WWW 浏览器是 Netscape 2.0 beta 3 以上版本的话,那你就可以

看到相关的结果,而如果你的浏览器并非是可以支援 JavaScript 的话,那看起

来就会有一些怪怪的了,以上范例的结果如下:

This is a normal HTML document.
这是以 JavaScript 印出的!
Back in HTML again.
此一范例并没有太大的用处,它只是要告诉你如何使用<script>的标签,并

如何将它置於 HTML 的文件之中而已,这个新的标签你可以特它放在文件

中的任何地方。


 



范例 2:

接下来下一个例子所要介绍的是有关函数 (function) 的使用。请放心,函数并

非很难懂的东西,但它却相当有用。函数通常是在 HTML 文件中 <body >的

部份被呼叫,而理所当然地,它最好事先被宣告并放在 HTML 文件中 <body>

的部份。好让在 <body> 部分中使用到函数时,它已确定被读取住来。另外,

<script> 标签的有关描述语法剖份,你可以用注解的符号将它括起来,以免旧

版或无法读取 JavaScript 的浏览器读到,而误会了意思!

<html>
<head>
<script language="LiveScript">
function pushbutton() {
alert("嗨! 你好");
}
</script>
</head>
<body>
<form>
<input type="button" name="Button1" value="Push me" onclick="pushbutton()">
</form>
</body>
</html>

如果你是使用 Netscape 2.0 beta 3 以上的浏览器,那以上 JavaScript 语法部份

的结果如下,你可以试着按按钮看看有何结果产生!

在范例 2 中,将会产生一个按钮,当你用滑鼠去按它的时候,应该会出现

一个视窗上面有“嗨! 你好”的字串,如何?不错吧!这个结果是如何产生

的呢?首先,在 <head>内的函数会被载入并存於内存中,接着一个新

的 <form>标签 <input type ="button".....>将产生一个接钮。然後,你可以

在後面看到 'onClick' 的指令,这就是告诉浏览器,当该按钮被按时,应会执行

onClick 後的函数 'pushbutton()',而这个函数在刚刚程式被载入时就已安放在

记忆体中了!请注意,在这个函数中我们用到了个新东西- alert 的 method,

是 JavaScript 事先定义好的,它会以对话视窗产生内涵的讯息,并有一"确定"

(OK)的按钮。 JavaScript 定义了许多的 method,你可以连至 Netscape 公司去

获取较完整的讯息。我想这些 method 在不久的将来会有长长的一串可以够你

学的,不过目前的 method 也已经可以做出相当多东西了!

接着下个例子将告诉你如何由一个输入型表格中读入使用者的输入资料,

事实上,这也是加入个函数就可以达成的。


 



范例 3:

<html>
<head>
<script language="LiveScript">
<!--  hide script from old browsers
function getname(str) {
alert("哈罗! "+ str+"!");
}
// end hiding contents -->
</script>
</head>
<body>
Please enter your name:
<form>
<input type="text" name="name" onBlur="getname(this.value)" value="">
</form>
</body>
</html>

现在你可以试试结果如何:

请输入你的名字:

(<!- ... ->) 此部分即我们之前所提到的它可以避免旧版本或是不支援 JavaScript

的 WWW 浏览器因为不认识这些函数而产生错误。它的顺序应 该为 <script>

先,接着为注解的开头 <!-,然後是内容,注解尾 ->, 最後是 </script>。

另外要注意的一点是,语解尾那一行的开头双斜线 "//" ,不可以省略,它代表了

JavaScript 的注解,若省略了的话, ->之前的字会被误认为是 JavaScript 的指令。


这个例子可以让使用者输入一段文字,然後再输入完毕後经由 <input>标签中的

"onBlur" 事件函数侦知,於是呼叫 Getname(Str)这个函数来加以取得输入字串,

并将它显示在对话视窗上!函数 Getname(this.value) 中的 "this.value" 是你在文

字输入格式中所输入的值。


 



范例 4:

这个范例更是帅了!我们在 HTML 文件档完成了以後,常会加上一行文件

最後修改的日期,现在你可不用担心每次都要去改或是忘了改了。你可以

很简单的写一个如下的描述语法程式,就可以自动的为你每次产生最後修

改的日期了:

<html>
<body>
This is a simple HTML- page.
<br>
Last changes:
<script language="LiveScript">
<!--  hide script from old browsers
document.write(document.lastModified)
// end hiding contents -->
</script>
</body>
</html>

以上的 document.lastModified 叁数在 Netscape 2.0 beta 2 版时是被写成

documeut.lastmodified 的,然而,之後的版本就改为 document.lastModified

所以注意一下 ;JavaScript 本身是会区分大小写的, lastmodifiedlastModified

在它看来是不同的结果。

最後,在这一部分结束之前,要提醒你一点,像范例 4 ,的用法并非每一部

机器都是一样的,例如:PC 上跑得很正确的,在工作站上不一定会有相同的

结果,所以,或许你仍得测一测不同机器的结果才会有所定论。当然,这一切

是因为 JavaScript 还正在发展的原因,最新的讯息还是得去拜访一下Netscape

公司才知道。也许你也不用奇怪,当你隔周再来访时,JavaScript 可能又作了

相当大的改变了呢

在这个例子中又有新的东西了。首先,让我们注意一下,在语法中的注解部分

posted @ 2008-06-30 11:20 sunny spring 阅读(296) | 评论 (0)编辑 收藏

HTML标签详解

HTML指令详解
结构
<html>
<head>
<title>标题<title>
</head>
<body>..........文件内容..........
</body>
</html>
1.文件标题
<title>..........</title>
2.文件更新--<meta>
【1】10秒后自动更新一次
<meta http-equiv="refresh" content=10>
【2】10秒后自动连结到另一文件
<meta http-equiv="refresh" content="10;URL=欲连结文件之URL">
3.查询用表单--<isindex>
若欲设定查询栏位前的提示文字:
<isindex prompt="提示文字">
4.预设的基准路径--<base>
<base href="放置文件的主机之URL">
版面
1.标题文字 <h#>..........</h#> #=1~6;h1为最大字,h6为最小字
2.字体变化 <font>..........</font>
【1】字体大小 <font size=#>..........</font> #=1~7;数字愈大字也愈大
【2】指定字型 <font face="字型名称">..........</font>
【3】文字颜色 <font color=#rrggbb>..........</font> rr:表红色(red)色码 gg:表绿色(green)色码 bb:表蓝色(blue)色码
3.显示小字体 <small>..........</small>
4.显示大字体 <big>..........</big>
5.粗体字 <b>..........</b>
6.斜体字 <i>..........</i>
7.打字机字体 <tt>..........</tt>
8.底线 <u>..........</u>
9.删除线 <strike>..........</strike>
10.下标字 <sub>..........</sub>
11.上标字 <sup>..........</sup>
12.文字闪烁效果 <blink>..........</blink>
13.换行 <br>
14.分段 <p>
15.文字的对齐方向 <p align="#"> #号可为 left:表向左对齐(预设值) center:表向中对齐 right:表向右对齐 P.S.<p align="#">之后的文字都会以所设的对齐方式显示, 直到出现另一个<p align="#">改变其对齐方向,或遇到 <hr>ⅱ<h#>标签时会自动设回预设的向左对齐。
16.分隔线 <hr>
【1】分隔线的粗细 <hr size=点数>
【2】分隔线的宽度 <hr size=点数或百分比>
【3】分隔线对齐方向 <hr align="#"> #号可为 left:表向左对齐(预设值) center:表向中对齐 right:表向右对齐
【4】分隔线的颜色 <hr color=#rrggbb>
【5】实心分隔线 <hr noshade>
17.向中对齐 <center>..........</center>
18.依原始样式显示 <pre>..........</pre>
19.<body>指令的属性
【1】背景颜色 -- bgcolor <body bgcolor=#rrggbb>
【2】背景图案 -- background <body background="图形文件名">
【3】设定背景图案不会卷动 -- bgproperties <body bgproperties=fixed>
【4】文件内容文字的颜色 -- text <body text=#rrggbb>
【5】超连结文字颜色 -- link <body link=#rrggbb>
【6】正被选取的超连结文字颜色 -- vlink <body vlink=#rrggbb>
【7】已连结过的超连结文字颜色 -- alink <body alink=#rrggbb>
20.注解 <!--..........-->21.特殊字元表示法
符 号 语 法
< &lt
> &gt
& &amp
" &quot
空白 &nbsp

图片
1.插入图片 <img src="图形文件名">
2.设定图框 -- border <img src="图形文件名" border=点数>
3.设定图形大小 -- widthⅱheight <img src="图形文件名" width=宽度点数 height=高度点数>
4.设定图形上下左右留空 -- vspaceⅱhspace <img src="图形文件名" vspace=上下留空点数 hspace=左右留空点数>
5.图形附注 <img src="图形文件名" alt="说明文字">
6.预载图片
<img src="高解析度图形文件名" lowsrc="低解析度图形文件名"> P.S.两个图的图形大小最好一致
7.影像地图(Image Map) <img src="图形文件名" usemap="#图的名称"> <map name="图的名称"

<area shape=形状 coords=区域座标列表 href="连结点之URL">
<area shape=形状 coords=区域座标列表 href="连结点之URL">
<area shape=形状 coords=区域座标列表 href="连结点之URL">
<area shape=形状 coords=区域座标列表 href="连结点之URL"> </map>
【1】定义形状 -- shape
shape=rect:矩形 shape=circle:圆形 shape=poly:多边形
【2】定义区域 -- coords
a.矩形:必须使用四个数字,前两个数字为左上角座标,后两个数字为右下角座标
例:<area shape=rect coords=100,50,200,75 href="URL">
b.圆形:必须使用三个数字,前两个数字为圆心的座标,最后一个数字为半径长度
例:<area shape=circle coords=85,155,30 href="URL">
c.任意图形(多边形):将图形之每一转折点座标依序填入
例:<area shape=poly coords=232,70,285,70,300,90,250,90,200,78 href="URL">
表格
1.定义表格 <table>..........</table>
【1】设定边框的厚度 -- border
<table border=点数>
【2】设定格线的宽度 -- cellspacing
<table cellspacing=点数>
【3】设定资料与格线的距离 -- cellpadding
<table cellpadding=点数>
【4】调整表格宽度 -- width
<table width=点数或百分比>
【5】调整表格高度 -- height
<table height=点数或百分比>
【6】设定表格背景色彩 -- bgcolor
<table bgcolor=#rrggbb>
【7】设定表格边框色彩 -- bordercolor
<table bordercolor=#rrggbb

2.显示格线 <table border>
3.表格标题
<caption>..........</caption>
表格标题位置 -- align
<caption align="#"> #号可为 top:表标题置于表格上方(预设值)
bottom:表标题置于表格下方
4.定义列 <tr>
5.定义栏位 《1》<td>:靠左对齐
《2》<th>:靠中对齐ⅱ粗体
【1】水平位置 -- align <th align="#">
#号可为 left:向左对齐
center:向中对齐 right:向右对齐
【2】垂直位置 -- align <th align="#"> #号可为
top:向上对齐 middle:向中对齐
bottom:向下对齐
【3】栏位宽度 -- width
<th width=点数或百分比>
【4】栏位垂直合并 -- rowspan
<th rowspan=欲合并栏位数>
【5】栏位横向合并 -- colspan
<th colspan=欲合并栏位数>
清单
一、目录式清单
<dir> <li>项目1 <li>项目2 <li>项目3 </dir> P.S.目录式清单每一个项目不能超过20个字元(即10个中文字)
二、选项式清单 <menu> <li>项目1 <li>项目2 <li>项目3 </menu>
三、有序号的清单 <ol> <li>项目1 <li>项目2 <li>项目3 </ol>
【1】序号形式 -- type <ol type=#>或<li type=#> #号可为 A:表以大写英文字母AⅱBⅱCⅱD...做为项目编号 a:表以小写英文字母aⅱbⅱcⅱd...做为项目编号 I:表以大写罗马数字做为项目编号 i:表以小写罗马数字做为项目编号 1:表以阿拉伯数字做为项目编号(预设值)
【2】起始数字 -- start <ol start=欲开始计数的序数>
【3】指定编号 -- value <li value=欲指定的序数>
四、无序号的清单 <ul> <li>项目1 <li>项目2 <li>项目3 </ul>

【1】项目符号形式 -- type <ul type=#>或<li type=#> #号可为 disc:实心圆点(预设值) circle:空心圆点 square:实心方块
【2】原始清单 -- plain <ul plain>
【3】清单排列方式 -- warp 《1》清单垂直排列 <ul warp = vert> 《2》清单水平排列 <ul warp = horiz>
五、定义式清单 <dl> <dt>项目1 <dd>项目1说明 <dt>项目2 <dd>项目2说明 <dt>项目3 <dd>项目3说明 </dl>
紧密排列 -- compact <dl compact> P.S.如此可使<dt>的内容与<dd>的内容在同一行,仅 以数格空白相隔而不换行,但若<dt>的文字超过一 定的长度后,compact的作用就消失了!
表单
一、基本架构 <form action="处理资料用的CGI程式之URL"或"mailt电子信箱的URL" method="get或post"> .......... .......... .......... </form>
二、输入文件型表单 <form action="URL" method="post"> <input> <input> .......... .......... </form>
【1】栏位类型 -- type <input type=#> #号可为 text:文字输入 password:密码 checkbox:多选钮 radio:单选钮 submit:接受按钮 reset:重设按钮 image:图形钮 hidden:隐藏栏位
【2】栏位名称 -- name <input name="资料栏名"> P.S.若type为submitⅱreset则name不必设定
【3】文件上的预设值 -- value <input value="预设之字串">
【4】设定栏位的宽度 -- size <input size=字元数>
【5】限制最大输入字串的长度 -- maxlength <input maxlength=字元数>
【6】预设checkbox或radio的初值 -- checked <input type=checkbox checked> <input type=radio checked>

【7】指定图形的URL -- src <input type=image src="图档名">
【8】图文对齐 -- align <input type=image align="#"> #号可为 top:文字对齐图片之顶端 middle:文字对齐图片之中间 buttom:文字对齐图片之底部
三、选择式表单 <form action="URL" method="post"> <select> <option> <option> .......... .......... </select> </form>
A、<select>的属性
【1】栏位名称 -- name <select name="资料栏位名">
【2】设定显示的选项数 -- size <select size=个数>
【3】多重选项 -- multiple <select multiple>
B、<option>的属性
【1】定义选项的传回值 -- value <option value="传回值">
【2】预先选取的选项 -- selected <option selected>
四、多列输入文字区表单 <form action="URL" method="post"> <textarea> .......... .......... </textarea> </form>
【1】文字区的变数名称 -- name <textarea name=变数名称>
【2】设定文字输入区宽度 -- cols <textarea cols=字元数>
【3】设定文字输入区高度 -- rows <textarea rows=列数>
【4】输入区设定预设字串 <textarea> 预设文字 </textarea>
【5】自动换行与否 -- wrap <textarea wrap=#> #号可为 off:表输入的文字超过栏宽时,不会自动换行(预设值) virtual:表输入的文字在超过栏宽时会自动换行
链接
一、连结至其他文件 <a href="URL">说明文字或图片</a>

二、连结至文件内之某一处(外部连结)
《1》起点
<a href="档名#名称">..........</a>
《2》终点 <a name="名称">
三、frame的超连结
【1】开启新的浏览器来显示连结文件 -- _blank <a href="URL" target=_blank>
【2】显示连结文件於目前的frame -- _self <a href="URL" target=_self>
【3】以上一层的分割视窗显示连结文件 -- _parent <a href="URL" target=_parent>
【4】以全视窗显示连结文件 -- _top <a href="URL" target=_top>
【5】以特定视窗显示连结文件 --<a href="URL" target="特定视窗名称">
FRAME
一、分割视窗指令 <frameset>..........</frameset>
【1】垂直(上下)分割 -- rows
<frameset rows=#> #号可为点数:如欲分割为100,200,300三个视窗,则
<frameset rows=100,200,300>;亦可以*号代表,如<frameset rows=*,500,*>
百分比:如<frameset rows=30%,70%>,各 项总和最好为100%
【2】水平(左右)分割 -- cols <frameset cols=点数或百分比>
二ⅱ指定视窗内容 -- <frame>
<frameset cols=30%,70%> <frame> <frame> </frameset>
【1】指定视窗的文件名称 -- src <frame src=HTML档名>
【2】定义视窗的名称 -- name
<frame name=视窗名称>
【3】设定文件与上下边框的距离 -- marginheight
<frame marginheight=点数>
【4】设定文件与左右边框的距离 -- marginwidth
<frame marginwidth=点数>
【5】设定分割视窗卷轴 -- scrollin

<frame scrolling=#> #号可为 yes:固定出现卷轴
no:不出现卷轴 auto:自动判断文件大小需不需要卷轴(预设值)
【6】锁住分割视窗的大小 -- noresize <frame noresize>

posted @ 2008-06-30 11:16 sunny spring 阅读(447) | 评论 (0)编辑 收藏

java文件上传代码

1 package com.khan.web;
   2
   3 import java.io.DataInputStream;
   4 import java.io.File;
   5 import java.io.FileNotFoundException;
   6 import java.io.FileOutputStream;
   7 import java.io.IOException;
   8 import javax.servlet.http.HttpServletRequest;
   9 import java.io.*;
10 import java.util.HashMap;
11
12
13 public class uploadFile   {
14      public static final int MAX_SIZE = 1024 * 1024*100;
15      public static final String FILE_DIR = "d:/temp/";
16
17      private int file_Size=0;
18      private String file_Path = "";
19      private HashMap hm = new HashMap();
20
21      public String upLoad(HttpServletRequest req) {
22          String tmpString ="";
23          String result = "";
24          DataInputStream dis = null;
25          String split_Str = "";
26
27          try {
28              dis = new DataInputStream(req.getInputStream());
29              String content = req.getContentType();
30              if (content != null && content.indexOf("multipart/form-data") != -1) {
31
32                  int reqSize = req.getContentLength();
33                  byte[] data = new byte[reqSize];
34                  int bytesRead = 0;
35                  int totalBytesRead = 0;
36                  int sizeCheck = 0;
37                  while (totalBytesRead < reqSize) {
38                      // check for maximum file size violation
39                      sizeCheck = totalBytesRead + dis.available();
40                      if (sizeCheck > MAX_SIZE)
41                          result = "文件太大不能上传";
42
43                      bytesRead = dis.read(data, totalBytesRead, reqSize);
44                      totalBytesRead += bytesRead;
45                  }
46                  String dataString = null;
47                  //dataString = new String(data, "ISO-8859-1");
48                  dataString = new String(data);
49                  tmpString = new String(data);
50                  hm = parseAnotherParam(tmpString);
51                
52                  //取出字段分割符
53                  split_Str = dataString.substring(0, dataString.indexOf("\r\n"));
54                  // 分离filepath 并赋值
55                  dataString = dataString.substring(dataString.indexOf("filename=\""));
56                  String filePath = dataString.substring(0, dataString.indexOf("Content-Type:"));
57                  if (filePath==null && filePath.equals("")) return "";
58                  //System.out.println(filePath);
59                  dataString = new String(dataString.getBytes(),"ISO-8859-1");
60                  // 分离contentType 并赋值
61                  dataString = dataString.substring(dataString.indexOf("Content-Type:") + 1);
62                  dataString = dataString.substring(dataString.indexOf("\n") + 1);
63                  // 分离文件信息 获得最终想要的字节
64 //System.out.print("|"+dataString+"|");
65                  dataString = dataString.substring(2, dataString.indexOf(split_Str));
66 //System.out.println("|"+dataString+"|");
67                  dataString = dataString.substring(0, dataString.lastIndexOf("\n") - 1);
68 //System.out.print("|"+dataString+"|");
69                  if (writeFile(dataString.getBytes("ISO-8859-1"), FILE_DIR + getFileName(filePath))) {
70                      this.file_Size = dataString.getBytes("ISO-8859-1").length;
71                      this.file_Path = FILE_DIR + getFileName(filePath);
72                      result = "文件上传完毕";
73                  } else {
74                      result = "文件上传失败";
75                  }
76              } else {
77                  result = "content 必须为 multipart/form-data";
78              }
79          } catch (UnsupportedEncodingException ex4) {
80              result = "getBytes 失败 UnsupportedEncodingException错误";
81          } catch (NullPointerException e) {
82              result = "getBytes 失败 NullPointerException错误";
83          } catch (IOException ex1) {
84              result = "IOException 错误 ";
85          }
86
87          return result;
88      }
89
90      public String getFilePath(){
91          return this.file_Path;
92      }
93
94      public int getFileSize(){
95          return this.file_Size;
96      }
97
98      public boolean writeFile(byte[] data, String path) {
99          File f = null;
100          FileOutputStream fos = null;
101          try {
102              f = new File(path);
103              f.createNewFile();
104              fos = new FileOutputStream(f);
105              fos.write(data, 0, data.length);
106          } catch (FileNotFoundException e) {
107              return false;
108          } catch (IOException e) {
109              return false;
110          } finally {
111              try {
112                  fos.close();
113              } catch (IOException e) {
114                  return false;
115              }
116          }
117          return true;
118      }
119
120      public String getFileName(String arg) {
121          String path = "";
122          if (arg.indexOf("\"") > -1)
123              path = arg.substring(arg.indexOf("\"") + 1, arg.lastIndexOf("\""));
124          else
125              path = arg;
126      //System.out.println("file_path:"+arg);
127          path = path.substring(path.lastIndexOf("\\") + 1);
128          return path;
129      }
130
131
132      public HashMap parseAnotherParam(String str){
133        HashMap hm= new HashMap();
134        String key="";
135        String value="";
136        int startindex = 0;
137        int endindex = 0;
138
139        startindex = str.indexOf("Content-Disposition: form-data; name=\"") + "Content-Disposition: form-data; name=\"".length();
140        endindex = str.indexOf("\"\r\n\r\n");
141
142        while ( startindex >-1 && endindex > -1 ){
143          key = str.substring(startindex, endindex);
144
145          if(!str.substring(endindex , endindex + 5).equals("\"\r\n\r\n")   ){//去掉没有value的元素
146              str = str.substring(endindex);
147              startindex = str.indexOf("Content-Disposition: form-data; name=\"") + "Content-Disposition: form-data; name=\"".length();
148              endindex = str.indexOf("\"\r\n\r\n");
149              continue;
150          }
151          if( key.indexOf("\";") > -1){//去掉上传文件的参数以及编码
152             str = str.substring(str.indexOf("\";") + 2);
153             startindex = str.indexOf("Content-Disposition: form-data; name=\"") + "Content-Disposition: form-data; name=\"".length();
154             endindex = str.indexOf("\"\r\n\r\n");
155
156             continue;
157          } else
158              str = str.substring(endindex + 5);
159
160          value = str.substring(0, str.indexOf("\r\n"));
161          str = str.substring(str.indexOf("\r\n") + 2);
162          //System.out.println("key:"+key+" value:"+value);
163          hm.put(key,value);
164
165          startindex = str.indexOf("Content-Disposition: form-data; name=\"") + "Content-Disposition: form-data; name=\"".length();
166          endindex = str.indexOf("\"\r\n\r\n");
167
168        }
169        return hm;
170      }
171
172      public String getParameter(String param){
173          //System.out.println(hm.toString());
174        return (String)hm.get(param);
175      }
176
177
178 }

posted @ 2008-06-30 11:10 sunny spring 阅读(5287) | 评论 (1)编辑 收藏

ResultSet大全

开发的朋友,在操作数据库的时候,相信绝大部分人都用过它。但它不仅仅就是一个结果集的纯载体,仅仅只有存储的功能。下面就简略说一下它的功能。
  
   结果集大体上可以分为四类,它们各有特点,基本上都和Statement语句的创建方式有关。
   1、基本型(最基本,用得最广泛)
   创建方式:无参数创建型
   Statement st = conn.CreateStatement
   ResultSet rs = Statement.excuteQuery(sqlStr);
   特点:这种最简单,没有特别的功能(不支持滚动、更新等等),只能用next()逐个单方向去读取数据。
  
   2、滚动型
   创建方式:参数创建型
   Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)
   ResultSet rs = st.executeQuery(sqlStr)
   参数:
   resultSetType是设置ResultSet对象的类型可滚动
   resultSetConcurency是设置ResultSet对象能够修改的
   具体的参数值见ResultSet.
  
   特点:(和具体参数的设置有关。)这种类型支持滚动获取记录,可以向前向后操作,类似于分页功能的操作方式。如支持:next()、previous()、first()、absolute(int n)等等。
  
  
   3、更新型
   创建方式:(和2一样,不过参数选取不同)
   Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)
  
   特点:可以完成对数据库的更新操作。更新的方法是,把ResultSet的游标移动到你要更新的行,然后调用updateXXX(),再用updateRow()完成对数据库的写入。
  
   限制/要求:(1)对单表操作。(2)不包含join或者group by子句。
  
   4、保持型
   创建方式:
   Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)
   ResultSet rs = st.excuteQuery(sqlStr);
  
   参数:只介绍第三个resultsetSetHoldability,表示在结果集提交后结果集是否打开,其值为
   ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。
   ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭
  
   特点:一般情况下,在使用Statement执行完一个查询,又去执行另一个查询的时候,第一个查询的结果集就会被关闭。该方式可以自由设定是否关闭结果集。
   限制/要求:(1)只是在JDBC3.0的驱动下才能成立。

可更新的结果集:

更新一行:

                     

UpdateXXX()è cancelRowUpdates()èupdateRow()èrowUpdated()。

UpadateXXX()方法只能修改当前行的数据,并不能修改数据库中的数据,所以在调用updateXXX()后,还要调用updateRow()方法,用当前行中的新数据更新数据库。

CancelRowUpdates()方法用来放弃对当前行的修改,注意,要让这个方法有效,必须在调用updteRow()方法之前调用它。

rowUpdated()方法来判断当前行是否被更新。

插入行:

moveToInsertRow()方法移动游标到插入行,插入行是一个与可更新的结果集相联系的特殊的缓存行。

moveToInsertRow()èupdateXXX()ègetXXX()èinsertRow()èrowInserted()

insertRow()将新行传递给数据库,从而在新数据库中真正插入一行数据

rowInserted()方法来判断当前行是否是插入行。

删除一行:

deletRow()从结果集中和数据库中删除一行,当游标指向插入行的时候,不能调用这个方法。一个被删除的行可能在结果集中留下一个空的位置,可以调用 rowDeleted()方法来判断一行是否被删除。

可更新结果集的使用必须满足下面3个条件:

1, 只能是针对数据库中单张表单的查询

2, 查询语句中不能包含任何的join操作。

3, 查询操作的表中必须有主键,而且在查询的结果集中必须包含作为主键的字段。

结果集中执行插入操作,还应该满足下面两个条件

1, 查询操作必须选择数据库表中所有不能为空的列

2, 查询操作必须选择所有没有默认值的列。

判断ResultSet是否为空

ResultSet rs=stmt.executeQuery(sql);
rs == null;
rs.size()这个方法没有的
rs为ResultSet的引用,即使结果集里有0条记录,rs也不为空,所以用rs == null来判断结果集里是否有0条记录是错误的,而要用
rs.getRow(); 为0则表示没有记录--使用的时候也有问题
使用rs.next()是否为true来判断,会使游标前移一位,可能丢掉一条记录,不合适
boolean hasRows = false;

下面的方法较合适
while (rs.next()){
hasRows = true;
//Do your stuff
}

if (!hasRows ){
//Empty result set
}

//You dont have to test for null result set

posted @ 2008-06-30 11:06 sunny spring 阅读(984) | 评论 (0)编辑 收藏

javascript页面间传参数

a.html:

 

a.html
<script language="javascript">
function a(){
document.cookie="aaa1111";
//alert(document.cookie);
//window.location.href("b.html");
top.window.location = 'b.html';
}


</script>
<div>
<input type="button" onclick="a()" value="转到b.html" />
</div>

posted @ 2008-06-30 11:04 sunny spring 阅读(403) | 评论 (0)编辑 收藏

HTTP Status 403 - Access to the requested resource has been denied

刚刚解压版的Tomcat5.0.12,启动setup.bat后,通过浏览器访问:http://127.0.0.1:8080/admin

在登录界面输入用户名 both 和密码 tomcat 后出现下面的错误提示:

HTTP Status 403 - Access to the requested resource has been denied

 

问题原因:

D:\Tomcat5.0\conf 目录下的

tomcat-users.xml 文件内容如下:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
   <role rolename="tomcat"/>
   <role rolename="role1"/>
   <user username="tomcat" password="tomcat" roles="tomcat"/>
   <user username="role1" password="tomcat" roles="role1"/>
   <user username="both" password="tomcat" roles="tomcat,role1"/>
</tomcat-users>

问题修改:将tomcat-users.xml 文件内容改为

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
   <role rolename="tomcat"/>
   <role rolename="role1"/>
   <role rolename="manager"/>
   <role rolename="admin"/>

   <user username="admin" password="admin" roles="admin,manager"/>
   <user username="tomcat" password="tomcat" roles="tomcat"/>
   <user username="role1" password="tomcat" roles="role1"/>
   <user username="both" password="tomcat" roles="tomcat,role1"/>
</tomcat-users>

重新启动Tomcat ,在登录时使用 用户名admin 密码 admin 登录即可。

posted @ 2008-06-30 11:00 sunny spring 阅读(8182) | 评论 (4)编辑 收藏

JAVA正则表达式

public class Regular{

public static void main(String[]args){

//把字符串中的 "aaa"全部替换为"z" 打印zbzcz

System.out.println("aaabaaacaaa".replaceAll("a{3}","z"));

//把字符串的"aaa","aa"或者"a" 全部替换为"*" 打印*b*c*

System.out.println("aaabaaca".replaceAll("a{1,3},"\\*"));

//把字符串中的数字全部替换为"z" 打印zzzazzbzzcc

System.out.println("123a44b35cc".replaceAll("\ \d","z"));

//把字符串中的非数字全部替换为"0" 打印1234000435000

System.out.println("1234abc435def".replaceAll("\ \D","0"));

//把字符串中的"."全部替换为"\"打印abc\def\ghi\jk

System.out.println("abc.def.ghi.jk".replaceAll("\\.","\\\\"));

//把字符串中的"a.b"全部替换为"-","a.b"表示长度为3的字符串,以a开头以b结尾

//打印-hello-lining

System.out.println("axbhelloasblining".replaceAll("a.b","-"));

//把字符串中的所有词字符替换为"#"

//正则表达式"[a-zA-Z_0-9]等价于"\w"

//打印#.#.#.#.#.

System.out.println("a.b.c.1.2.".replace("\w","#"));

}



/**
     * filter all html element.
     * For example:<a href="www.sohu.com/test">hello!</a>
     * The filter result is :hello!
     * Notice:This method filter the text between "<" and ">"
     * @param element
     * @return
     */
     public static String getTxtWithoutHTMLElement (String element)
     {
//       String reg="<[^<|^>]+>";
//       return   element.replaceAll(reg,"");
        
         if(null==element||"".equals(element.trim()))
         {
             return element;
         }

         Pattern pattern=Pattern.compile("<[^<|^>]*>");
         Matcher matcher=pattern.matcher(element);
         StringBuffer txt=new StringBuffer();
         while(matcher.find())
         {
             String group=matcher.group();
             if(group.matches("<[\\s]*>"))
             {
                 matcher.appendReplacement(txt,group);    
             }
             else
             {
                 matcher.appendReplacement(txt,"");
             }
         }
         matcher.appendTail(txt);
         repaceEntities(txt,"&","&");
         repaceEntities(txt,"<","<");        
         repaceEntities(txt,">",">");
         repaceEntities(txt,""","\"");
         repaceEntities(txt," ","");
        
         return txt.toString();
     }



下面是测试用例:
public void testGetTxtWithoutHTMLElement ()
     {
        
         assertEquals("test",ExcelHssfView.getTxtWithoutHTMLElement("<a href='a/test'>test</a>"));
        
         assertEquals("test",ExcelHssfView.getTxtWithoutHTMLElement("<a href='a/test'>test"));
        
         assertEquals("test",ExcelHssfView.getTxtWithoutHTMLElement("<input type='text'>test</input>"));
        
         assertEquals("test",ExcelHssfView.getTxtWithoutHTMLElement("<p>test"));
        
         assertEquals("test",ExcelHssfView.getTxtWithoutHTMLElement("<table><tr><td>test</td></tr></table>"));
        
         assertEquals("te<st",ExcelHssfView.getTxtWithoutHTMLElement("<p>te<st"));
        
         assertEquals("te>st",ExcelHssfView.getTxtWithoutHTMLElement("<p>te>st"));
        
         assertEquals("tst",ExcelHssfView.getTxtWithoutHTMLElement("<p>t<e>st"));
        
         assertEquals("t<st",ExcelHssfView.getTxtWithoutHTMLElement("<p>t<<e>st"));
        
         assertEquals("<>test",ExcelHssfView.getTxtWithoutHTMLElement("<p><>test"));
        
         assertEquals("< >test",ExcelHssfView.getTxtWithoutHTMLElement("<p>< >test"));
        
         assertEquals("<<>test",ExcelHssfView.getTxtWithoutHTMLElement("<p><<>test"));
        
         assertEquals("test",ExcelHssfView.getTxtWithoutHTMLElement("<table><tr><td> test</td></tr></table>"));
        
     }

}

posted @ 2008-06-30 10:58 sunny spring 阅读(153) | 评论 (0)编辑 收藏

MyEclipse5.5下载 MyEclipse5.5注册码

到官方网站下载,这里有myeclipse5.5,有一个是MyEclipse5.5+Eclipse3.2.2
http://www.myeclipseide.com/index.php?module=htmlpages&func=display&pid=4


MyEclipse5.5   http://www.myeclipseide.com/module-htmlpages-display-pid-4.html
Eclipse3.2.2   http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.2.2-200702121330/eclipse-SDK-3.2.2-win32.zip   


MyEclipse5.5             注册码

                     Subscriber: www.1cn.biz
                     Subscriber Code: jLR8ZC-655355-5450765457039125
                    
                     Subscriber: www.1cn.biz
                     Subscriber Code: jLR7ZL-655355-5450755330522962

                     Subscriber: www.1cn.biz          
                     Subscriber Code: jLR8ZC-444-55-4467865481680090

                     MyEclipse5.5 M2注册码:适用于早期的 5.5 M2 版本的:
                     Subscriber: www.1cn.biz
                     Subscriber Code: jLR8ZC-956-55-5467865833584547

posted @ 2008-06-30 10:53 sunny spring 阅读(24643) | 评论 (44)编辑 收藏

不同数据库分页代码

1. ORACLE
SELECT * FROM TABLE1 WHERE ROWNUM<=N
2. INFORMIX
SELECT FIRST N * FROM TABLE1
3. DB2
SELECT * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM WHERE ROWNUM<=N
或者
SELECT COLUMN FROM TABLE FETCH FIRST N ROWS ONLY
4. SQL SERVER
SELECT TOP N * FROM TABLE1
5. SYBASE
SET ROWCOUNT N
GO
SELECT * FROM TABLE1
6. MYSQL
SELECT * FROM TABLE1 LIMIT N
7. FOXPRO
SELECT * TOP N FROM TABLE ORDER BY COLUMN

虽然 select * from table where rownum< 你要查的记录条数,能够取出前几条记录,但是你如果要把排序后记录取前几条结果就不对,如下 SQL 语句select * from table where rownum<50 order by 字段名 desc ,取出来的不时按照先排序后取前几名,而是先取前几名,再排序。

要实现先排序,再取前几名用下面这条语句select * from (select * from table order by 字段名 desc) where rownum<50

某一个字段没有重复的
其他的不要管 只要这条记录重复的情况下的第一条
select * from f where id in (select max(id) from f group by jid)

posted @ 2008-06-30 10:52 sunny spring 阅读(168) | 评论 (0)编辑 收藏

java概述

J2EE是一套全然不同于传统应用开发的技术架构,包含许多组件,主要可简化且规范应用系统的开发与部署,进而提高可移植性、安全与再用价值。
J2EE核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共通的标准及规格,让各种依循J2EE架构的不同平台之间,存在良好的兼容性,解决过去企业后端使用的信息产品彼此之间无法兼容,导致企业内部或外部难以互通的窘境。
在J2EE架构下,开发人员可依循规范基础,进而开发企业级应用;而不同J2EE供货商,同会支持不同J2EE版本内所拟定的标准,以确保不同J2EE平台与产品之间的兼容性。换言之,植基J2EE架构的应用系统,基本上可部署在不同的应用服务器之上,无需或者只须要进行少量的代码修改,即能大幅提高应用系统的可移植性(Portability)。
J2EE主由升阳与IBM等厂商协同业界共同拟定而成的技术规范,以企业与企业之间的运算为导向的JAVA开发环境。J2EE架构定义各类不同组件,如Web Component、EJB Component…等,而各类组件可以再用(reuse),让已开发完成的组件,或者是经由市面采购而得的组件,均能进一步组装成不同的系统。
对于开发人员而言,只需要专注于各种应用系统的商业逻辑与架构设计,至于底层繁琐的程序撰写工作,可搭配不同的开发平台,以让应用系统的开发与部署效率大幅提升。
J2EE的核心规范是 Enterprise Java Beans(EJBs)。EJB依照特性的不同,目前共分为三种,分别是Session Bean、Entity Bean,以及 Message Driven Bean 。其中 Session Bean 与Entity Bean 算是EJB的始祖,这两种EJB规格在EJB 1.x版本推出时就已经存在,而Message Driven Bean则是出现在EJB 2.0的规格之中。
目前业界许多程序设计师,或者是网页设计人员,多利用JSP/Servlet的便利性,进而在J2EE服务器之上开发相关的应用,或是整合公司内部的各种资源。
Java 2平台依照应用领域的不同,共分为三大版本,分别是J2EE、标准版本J2SE(Java 2 Platform, Standard Edition)、微型版本J2ME(Java 2 Platform, Micro Edition),以及Java Card等。
从整体上讲,J2EE是使用Java技术开发企业级应用的一种事实上的工业标准(Sun公司出于其自身利益的考虑,至今没有将Java及其相关技术纳入标准化组织的体系),它是Java技术不断适应和促进企业级应用过程中的产物。Sun推出J2EE的目的是为了克服传统Client/Server模式的弊病,迎合Browser/Server架构的潮流,为应用Java技术开发服务器端应用提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的开发、管理和部署。J2EE是一个标准,而不是一个现成的产品。各个平台开发商按照J2EE规范分别开发了不同的J2EE应用服务器,J2EE应用服务器是J2EE企业级应用的部署平台。由于它们都遵循了J2EE规范,因此,使用J2EE技术开发的企业级应用可以部署在各种J2EE应用服务器上。
为了推广并规范化使用J2EE架构企业级应用的体系架构,Sun同时给出了一个建议性的J2EE应用设计模型:J2EE Blueprints。J2EE Blueprints提供了实施J2EE企业级应用的体系架构、设计模式和相关的代码,通过应用J2EE Blueprints所描述的体系模型,能够部分简化架构企业级应用这项复杂的工作。J2EE Blueprints是开发人员设计和优化J2EE组件的基本原则,同时为围绕开发工作进行职能分工给出了指导性策略,以帮助应用开发设计人员合理地分配技术资源。
J2EE组成了一个完整企业级应用的不同部分纳入不同的容器(Container),每个容器中都包含若干组件(这些组件是需要部署在相应容器中的),同时各种组件都能使用各种J2EE Service/API。J2EE容器包括:
◆ Web容器 服务器端容器,包括两种组件JSP和Servlet,JSP和Servlet都是Web服务器的功能扩展,接受Web请求,返回动态的Web页面。Web容器中的组件可使用EJB容器中的组件完成复杂的商务逻辑。
◆ EJB容器 服务器端容器,包含的组件为EJB(Enterprise JavaBeans),它是J2EE的核心之一,主要用于服务器端的商业逻辑的实现。EJB规范定义了一个开发和部署分布式商业逻辑的框架,以简化企业级应用的开发,使其较容易地具备可伸缩性、可移植性、分布式事务处理、多用户和安全性等。
◆ Applet容器 客户端容器,包含的组件为Applet。Applet是嵌在浏览器中的一种轻量级客户端,一般而言,仅当使用Web页面无法充分地表现数据或应用界面的时候,才使用它。Applet是一种替代Web页面的手段,我们仅能够使用J2SE开发Applet,Applet无法使用J2EE的各种Service和API,这是为了安全性的考虑。
◆ Application Client容器 客户端容器,包含的组件为Application Client。Application Client相对Applet而言是一种较重量级的客户端,它能够使用J2EE的大多数Service和API。
通过这四个容器,J2EE能够灵活地实现前面描述的企业级应用的架构。
在View部分,J2EE提供了三种手段:Web容器中的JSP(或Servlet)、Applet和Application Client,分别能够实现面向浏览器的数据表现和面向桌面应用的数据表现。Web容器中的Servlet是实现Controller部分业务流程控制的主要手段;而EJB则主要针对Model部分的业务逻辑实现。至于与各种企业资源和企业级应用相连接,则是依靠J2EE的各种服务和API。
在J2EE的各种服务和API中,JDBC和JCA用于企业资源(各种企业信息系统和数据库等)的连接,JAX-RPC、JAXR和SAAJ则是实现Web Services和Web Services连接的基本支持。
J2EE的各种组件
我们就J2EE的各种组件、服务和API,进行更加详细的阐述,看看在开发不同类型的企业级应用时,根据各自需求和目标的不同,应当如何灵活使用并组合不同的组件和服务。
· Servlet
Servlet是Java平台上的CGI技术。Servlet在服务器端运行,动态地生成Web页面。与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更容易使用。对于Servlet,重复的请求不会导致同一程序的多次转载,它是依靠线程的方式来支持并发访问的。
· JSP
JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术。从这一点来看,非常类似Microsoft ASP、PHP等技术。借助形式上的内容和外观表现的分离,Web页面制作的任务可以比较方便地划分给页面设计人员和程序员,并方便地通过JSP来合成。在运行时态,JSP将会被首先转换成Servlet,并以Servlet的形态编译运行,因此它的效率和功能与Servlet相比没有差别,一样具有很高的效率。
· EJB
EJB定义了一组可重用的组件:Enterprise Beans。开发人员可以利用这些组件,像搭积木一样建立分布式应用。在装配组件时,所有的Enterprise Beans都需要配置到EJB服务器(一般的Weblogic、WebSphere等J2EE应用服务器都是EJB服务器)中。EJB服务器作为容器和低层平台的桥梁管理着EJB容器,并向该容器提供访问系统服务的能力。所有的EJB实例都运行在EJB容器中。EJB容器提供了系统级的服务,控制了EJB的生命周期。EJB容器为它的开发人员代管了诸如安全性、远程连接、生命周期管理及事务管理等技术环节,简化了商业逻辑的开发。EJB中定义了三种Enterprise Beans:
◆ Session Beans
◆ Entity Beans
◆ Message-driven Beans
· JDBC
JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据库开发人员能够用标准Java API编写数据库应用程序。JDBC API主要用来连接数据库和直接调用SQL命令执行各种SQL语句。利用JDBC API可以执行一般的SQL语句、动态SQL语句及带IN和OUT参数的存储过程。Java中的JDBC相当与Microsoft平台中的ODBC(Open Database Connectivity)。
· JMS
JMS(Java Message Service,Java消息服务)是一组Java应用接口,它提供创建、发送、接收、读取消息的服务。JMS API定义了一组公共的应用程序接口和相应语法,使得Java应用能够和各种消息中间件进行通信,这些消息中间件包括IBM MQ-Series、Microsoft MSMQ及纯Java的SonicMQ。通过使用JMS API,开发人员无需掌握不同消息产品的使用方法,也可以使用统一的JMS API来操纵各种消息中间件。通过使用JMS,能够最大限度地提升消息应用的可移植性。 JMS既支持点对点的消息通信,也支持发布/订阅式的消息通信。
· JNDI
由于J2EE应用程序组件一般分布在不同的机器上,所以需要一种机制以便于组件客户使用者查找和引用组件及资源。在J2EE体系中,使用JNDI(Java Naming and Directory Interface)定位各种对象,这些对象包括EJB、数据库驱动、JDBC数据源及消息连接等。JNDI API为应用程序提供了一个统一的接口来完成标准的目录操作,如通过对象属性来查找和定位该对象。由于JNDI是独立于目录协议的,应用还可以使用JNDI访问各种特定的目录服务,如LDAP、NDS和DNS等。
· JTA
JTA(Java Transaction API)提供了J2EE中处理事务的标准接口,它支持事务的开始、回滚和提交。同时在一般的J2EE平台上,总提供一个JTS(Java Transaction Service)作为标准的事务处理服务,开发人员可以使用JTA来使用JTS。
· JCA
JCA(J2EE Connector Architecture)是J2EE体系架构的一部分,为开发人员提供了一套连接各种企业信息系统(EIS,包括ERP、SCM、CRM等)的体系架构,对于EIS开发商而言,它们只需要开发一套基于JCA的EIS连接适配器,开发人员就能够在任何的J2EE应用服务器中连接并使用它。基于JCA的连接适配器的实现,需要涉及J2EE中的事务管理、安全管理及连接管理等服务组件。
· JMX
JMX(Java Management Extensions)的前身是JMAPI。JMX致力于解决分布式系统管理的问题。JMX是一种应用编程接口、可扩展对象和方法的集合体,可以跨越各种异构操作系统平台、系统体系结构和网络传输协议,开发无缝集成的面向系统、网络和服务的管理应用。JMX是一个完整的网络管理应用程序开发环境,它同时提供了厂商需要收集的完整的特性清单、可生成资源清单表格、图形化的用户接口;访问SNMP的网络API;主机间远程过程调用;数据库访问方法等。
· JAAS
JAAS(Java Authentication and Authorization Service)实现了一个Java版本的标准Pluggable Authentication Module(PAM)的框架。JAAS可用来进行用户身份的鉴定,从而能够可靠并安全地确定谁在执行Java代码。同时JAAS还能通过对用户进行授权,实现基于用户的访问控制。
· JACC
JACC(Java Authorization Service Provider Contract for Containers)在J2EE应用服务器和特定的授权认证服务器之间定义了一个连接的协约,以便将各种授权认证服务器插入到J2EE产品中去。
· JAX-RPC
通过使用JAX-RPC(Java API for XML-based RPC),已有的Java类或Java应用都能够被重新包装,并以Web Services的形式发布。JAX-RPC提供了将RPC参数(in/out)编码和解码的API,使开发人员可以方便地使用SOAP消息来完成RPC调用。同样,对于那些使用EJB(Enterprise JavaBeans)的商业应用而言,同样可以使用JAX-RPC来包装成Web服务,而这个Web Servoce的WSDL界面是与原先的EJB的方法是对应一致的。JAX-RPC为用户包装了Web服务的部署和实现,对Web服务的开发人员而言,SOAP/WSDL变得透明,这有利于加速Web服务的开发周期。
· JAXR
JAXR(Java API for XML Registries)提供了与多种类型注册服务进行交互的API。JAXR运行客户端访问与JAXR规范相兼容的Web Servcices,这里的Web Services即为注册服务。一般来说,注册服务总是以Web Services的形式运行的。JAXR支持三种注册服务类型:JAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支持UDDI Registry和ebXML Registry/Repository等)。
· SAAJ
SAAJ(SOAP with Attachemnts API for Java)是JAX-RPC的一个增强,为进行低层次的SOAP消息操纵提供了支持。
企业级应用示例
下面我们通过假设一个企业应用的J2EE实现,来了解各种组件和服务的应用。假设应用对象是计算机产品的生产商/零售商的销售系统,这个销售系统能够通过自己的网站发布产品信息,同时也能将产品目录传送给计算机产品交易市场。销售系统能够在线接受订单(来自自己的Web网站或者来自计算机产品交易市场),并随后转入内部企业管理系统进行相关的后续处理。
参见图3,这个企业应用可以这种方式架构。该企业应用的核心是产品目录管理和产品定购管理这两个业务逻辑,使用EJB加以实现,并部署在EJB容器中。由于产品目录和定购信息都需要持久化,因此使用JDBC连接数据库,并使用JTA来完成数据库存取事务。
图3 J2EE应用示例
然后使用JSP/Servlet来实现应用的Web表现:在线产品目录浏览和在线定购。为了将产品目录发送给特定的交易市场,使用JMS实现异步的基于消息的产品目录传输。为了使得更多的其它外部交易市场能够集成产品目录和定购业务,需要使用Web Services技术包装商业逻辑的实现。由于产品定购管理需要由公司内部雇员进行处理,因此需要集成公司内部的用户系统和访问控制服务以方便雇员的使用,使用JACC集成内部的访问控制服务,使用JNDI集成内部的用户目录,并使用JAAS进行访问控制。由于产品订购事务会触发后续的企业ERP系统的相关操作(包括仓储、财务、生产等),需要使用JCA连接企业ERP。
最后为了将这个应用纳入到企业整体的系统管理体系中去,使用Application Client架构了一个管理客户端(与其它企业应用管理应用部署在一台机器上),并通过JMX管理这个企业应用。

posted @ 2008-06-30 10:49 sunny spring 阅读(99) | 评论 (0)编辑 收藏

ping命令的作用

Ping是潜水艇人员的专用术语,表示回应的声纳脉冲,在网络中Ping 是一个十分好用的TCP/IP工具。它主要的功能是用来检测网络的连通情况和分析网络速度。

Ping有好的善的一面也有恶的一面。先说一下善的一面吧。上面已经说过Ping的用途就是用来检测网络的连同情况和分析网络速度,但它是通过什么来显示连通呢?这首先要了解Ping的一些参数和返回信息。

以下是PING的一些参数:

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] | [-k computer-list] [-w timeout] destination-list

-t
Ping 指定的计算机直到中断。

-a
将地址解析为计算机名。

-n count
发送 count 指定的 ECHO 数据包数。默认值为 4。

-l length
发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节;最大值是65,527。

-f
在数据包中发送"不要分段"标志。数据包就不会被路由上的网关分段。

-i ttl
将"生存时间"字段设置为 ttl 指定的值。

-v tos
将"服务类型"字段设置为 tos 指定的值。

-r count
在"记录路由"字段中记录传出和返回数据包的路由。count 可以指定最少 1 台,最多 9 台计算机。

-s count
指定 count 指定的跃点数的时间戳。

-j computer-list
利用 computer-list 指定的计算机列表路由数据包。连续计算机可以被中间网关分隔(路由稀疏源)IP 允许的最大数量为 9。

-k computer-list
利用 computer-list 指定的计算机列表路由数据包。连续计算机不能被中间网关分隔(路由严格源)IP 允许的最大数量为 9。

-w timeout
指定超时间隔,单位为毫秒。

destination-list
指定要 ping 的远程计算机。

Ping的返回信息有"Request Timed Out"、"Destination Net Unreachable"和"Bad IP address"还有"Source quench received"。

"Request Timed Out"这个信息表示对方主机可以到达到TIME OUT,这种情况通常是为对方拒绝接收你发给它的数据包造成数据包丢失。大多数的原因可能是对方装有防火墙或已下线。

"Destination Net Unreachable"这个信息表示对方主机不存在或者没有跟对方建立连接。这里要说明一下"destination host unreachable"和"time out"的区别,如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其它原因不可到达,这时候会出现"time out",如果路由表中连到达目标的路由都没有,那就会出现"destination host unreachable"。

"Bad IP address" 这个信息表示你可能没有连接到DNS服务器所以无法解析这个IP地址,也可能是IP地址不存在。

"Source quench received"信息比较特殊,它出现的机率很少。它表示对方或中途的服务器繁忙无法回应。

怎样使用Ping这命令来测试网络连通呢?

连通问题是由许多原因引起的,如本地配置错误、远程主机协议失效等,当然还包括设备等造成的故障。

首先我们讲一下使用Ping命令的步骤。

使用Ping检查连通性有五个步骤:

1. 使用ipconfig /all观察本地网络设置是否正确;
2. Ping 127.0.0.1,127.0.0.1 回送地址Ping回送地址是为了检查本地的TCP/IP协议有没有设置好;
3. Ping本机IP地址,这样是为了检查本机的IP地址是否设置有误;
4. Ping本网网关或本网IP地址,这样的是为了检查硬件设备是否有问题,也可以检查本机与本地网络连接是否正常;(在非局域网中这一步骤可以忽略)
5. Ping远程IP地址,这主要是检查本网或本机与外部的连接是否正常。

在检查网络连通的过程中可能出现一些错误,这些错误总的来说分为两种最常见。

1. Request Timed Out
"request time out"这提示除了在《PING(一)》提到的对方可能装有防火墙或已关机以外,还有就是本机的IP不正确和网关设置错误。
①、IP不正确:
IP不正确主要是IP地址设置错误或IP地址冲突,这可以利用ipconfig /all这命令来检查。在WIN2000下IP冲突的情况很少发生,因为系统会自动检测在网络中是否有相同的IP地址并提醒你是否设置正确。在NT中不但会出现"request time out"这提示而且会出现"Hardware error"这提示信息比较特殊不要给它的提示所迷惑。
②、网关设置错误:这个错误可能会在第四个步骤出现。网关设置错误主要是网关地址设置不正确或网关没有帮你转发数据,还有就是可能远程网关失效。这里主要是在你Ping外部网络地址时出错。错误表现为无法Ping外部主机返回信息"Request timeout"。

2. Destination Host Unreachable
当你在开始PING网络计算机时如果网络设备出错它返回信息会提示"destination host unreachable"。如果局域网中使用DHCP分配IP时,而碰巧DHCP失效,这时使用 PING命令就会产生此错误。因为在DHCP失效时客户机无法分配到IP系统只有自设IP,它往往会设为不同子网的IP。所以会出现"Destination Host Unreachable"。另外子网掩码设置错误也会出现这错误。
还有一个比较特殊就是路由返回错误信息,它一般都会在"Destination Host Unreachable"前加上IP地址说明哪个路由不能到达目标主机。这说明你的机器与外部网络连接没有问题,但与某台主机连接存在问题。

举个例子吧。
我管理的网络有19台机,由一台100M集线器连接服务器,使用DHCP动态分配IP地址。
有一次有位同事匆忙地告诉我"我的OUTLOOK打不开了",我到他机器检查,首先我检查了本地网络设置,我用ipconfig /all看IP分配情况一切正常。接着我就开始PING网络中的其中一台机器,第一次PING结果很正常,但OUTLOOK还是无法使用其它网络软件和Copy网络文件都可以使用但网络速度很慢,第二次PING我用了一个参数-t(-t可以不中断地PING对方,当时我想PING一次可能发现不了问题)发现有time=30ms和request time out,从服务器PING这台机就更有趣,request time out比正常数据还多,在局域中竟然有time=30ms和request time out太不正常了。开始我认为是网卡的问题但换网卡后故障依旧,重做网线还是不能解决问题,这故障真有趣!最后我没办法了把它插在集线器端口上的另一端的网线换到另一个端口,哈!故障解决了。原来是集线器端口坏了。

如何用Ping命令来判断一条链路的速度?

Ping这个命令除了可以检查网络的连通和检测故障以外,还有一个比较有趣的用途,那就是可以利用它的一些返回数据,来估算你跟某台主机之间的速度是多少字节每秒

我们先来看看它有那些返回数据。

Pinging 202.105.136.105 with 32 bytes of data:

Reply from 202.105.136.105: bytes=32 time=590ms TTL=114
Reply from 202.105.136.105: bytes=32 time=590ms TTL=114
Reply from 202.105.136.105: bytes=32 time=590ms TTL=114
Reply from 202.105.136.105: bytes=32 time=601ms TTL=114

Ping statistics for 202.105.136.105:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 590ms, Maximum = 601ms, Average = 593ms

在例子中"bytes=32"表示ICMP报文中有32个字节的测试数据(这是估算速度的关键数据),"time=590ms"是往返时间。

怎样估算链路的速度呢?举个例子吧。我们把A和B之间设置为PPP链路。

从上面的PING例子可以注意到,默认情况下发送的ICMP报文有32个字节。除了这32个字节外再加上20个字节的IP首部和8个字节的ICMP首部,整个IP数据报文的总长度就是60个字节(因为IP和ICMP是Ping命令的主要使用协议,所以整个数据报文要加上它们)。另外在使用Ping命令时还使用了另一个协议进行传输,那就是PPP协议(点对点协议),所以在数据的开始和结尾再加上8个字节。在传输过程中,由于每个字节含有8bit数据、1bit起始位和1bit结束位,因此传输速率是每个字节2.98ms。由此我们可以估计需要405ms。即68*2.98*2(乘2是因为我们还要计算它的往返时间)。

我们来测试一下33600 b/s的链路:

Pinging 202.105.36.125 with 32 bytes of data:

Reply from 202.105.36.125: bytes=32 time=415ms TTL=114
Reply from 202.105.36.125: bytes=32 time=415ms TTL=114
Reply from 202.105.36.125: bytes=32 time=415ms TTL=114
Reply from 202.105.36.125: bytes=32 time=421ms TTL=114

Ping statistics for 202.105.36.125:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 415ms, Maximum = 421ms, Average = 417ms

看是不是差不多啊。^_^

这里大家可能要注意到,这估算值跟实际值是有误差的,为什么呢?因为我们现在估算的是一个理论值,还有一些东西我们没有考虑。比如在网络中的其它干扰,这些干扰主要来之别的计算机。因为在你测试时不可能全部计算机停止使用网络给你做测试,这是不实际的。另外就是传输设备,因为有某些设备如MODEM它在传输时会把数据压缩后再发送,这大大减少了传输时间。这些东西产生的误差我们是不能避免的,但其数值大约在5%以内我们都可以接受(利用MODEM传输例外),但是可以减少误差的产生。比如把MODEM的压缩功能关闭和在网络没有那么繁忙时进行测试。有时候误差是无须消除的。因为我们需要这些误差跟所求得的理论值进行比较分析,从而找出网络的缺陷而进行优化。这时测试网络的所有数据包括误差都会成为我们优化的依据。

还要注意,这种算法在局域网并不适用,因为在局域网中速度非常的快几乎少于1ms,而Ping的最小时间分辨率是1ms,所以根本无法用Ping命令来检测速度。如果想测试速度那就要用专门仪器来检测。

总的来说,Ping命令是一个在故障检查方面很有用而且很便利的工具,你不应该忽视它的存在。

posted @ 2008-06-30 10:47 sunny spring 阅读(161) | 评论 (0)编辑 收藏

DOS命令大全

MD——建立子目录
1.功能:创建新的子目录
2.类型:内部命令
3.格式:MD[盘符:][路径名]〈子目录名〉
4.使用说明:
(1)“盘符”:指定要建立子目录的磁盘驱动器字母,若省略,则为当前驱动器;
(2)“路径名”:要建立的子目录的上级目录名,若缺省则建在当前目录下。
例:(1)在C盘的根目录下创建名为FOX的子目录;(2)在FOX子目录下再创建USER子目录。
C:、>MD FOX (在当前驱动器C盘下创建子目录FOX)
C:、>MD FOX 、USER (在FOX 子目录下再创建USER子目录)
(二)CD——改变当前目录
1.功能:显示当前目录
2.类型:内部命令
3.格式:CD[盘符:][路径名][子目录名]
4.使用说明:
(1)如果省略路径和子目录名则显示当前目录;
(2)如采用“CD、”格式,则退回到根目录;
(3)如采用“CD.。”格式则退回到上一级目录。
例:(1)进入到USER子目录;(2)从USER子目录退回到子目录;(3)返回到根目录。
C:、>CD FOX 、USER(进入FOX子目录下的USER子目录)
C:、FOX、USER>CD.。 (退回上一级根目录)
C:、FOX>CD、 (返回到根目录)
C:、>
(三)RD——删除子目录命令
1.功能:从指定的磁盘删除了目录。
2.类型:内部命令
3.格式:RD[盘符:][路径名][子目录名]
4.使用说明:
(1)子目录在删除前必须是空的,也就是说需要先进入该子目录,使用DEL(删除文件的命令)将其子目录下的文件删空,然后再退回到上一级目录,用RD命令删除该了目录本身;
(2)不能删除根目录和当前目录。
例:要求把C盘FOX子目录下的USER子目录删除,操作如下:
第一步:先将USER子目录下的文件删空;
C、>DEL C:、FOX、USER、*。*
第二步,删除USER子目录。
C、>RD C:、FOX、USER
(四)DIR——显示磁盘目录命令
1.功能:显示磁盘目录的内容。
2.类型:内部命令
3.格式:DIR [盘符][路径][/P][/W]
4.
使用说明:/P的使用;当欲查看的目录太多,无法在一屏显示完屏幕会一直往上卷,不容易看清,加上/P参数后,屏幕上会分面一次显示23行的文件信息,然后暂停,并提示;Press
any key to continue
/W的使用:加上/W只显示文件名,至于文件大小及建立的日期和时间则都省略。加上参数后,每行可以显示五个文件名。
PATH——路径设置命令
1.功能:设备可执行文件的搜索路径,只对文件有效。
2.类型:内部命令
3.格式:PATH[盘符1]目录[路径名1]{[;盘符2:],〈目录路径名2〉…}
4.使用说明:
(1)当运行一个可执行文件时,DOS会先在当前目录中搜索该文件,若找到则运行之;若找不到该文件,则根据PATH命令所设置的路径,顺序逐条地到目录中搜索该文件;
(2)PATH命令中的路径,若有两条以上,各路径之间以一个分号“;”隔开;
(3)PATH命令有三种使用方法:
PATH[盘符1:][路径1][盘符2:][路径2]…(设定可执行文件的搜索路径) PATH:(取消所有路径)
PATH:(显示目前所设的路径)
(六)TREE——显示磁盘目录结构命令
1.功能:显示指定驱动器上所有目录路径和这些目录下的所有文件名。
2.类型:外部命令
3.格式:TREE[盘符:][/F][》PRN]
4.使用说明:
(1)使用/F参数时显示所有目录及目录下的所有文件,省略时,只显示目录,不显示目录下的文件;
(2)选用>PRN参数时,则把所列目录及目录中的文件名打印输出。
(七)DELTREE——删除整个目录命令
1.功能:将整个目录及其下属子目录和文件删除。
2.类型:外部命令
3.格式:DELTREE[盘符:]〈路径名〉
4.使用说明:该命令可以一步就将目录及其下的所有文件、子目录、更下层的子目录一并删除,而且不管文件的属性为隐藏、系统或只读,只要该文件位于删除的目录之下,DELTREE都一视同仁,照删不误。使用时务必小心!!!
五、磁盘操作类命令
(一)formAT——磁盘格式化命令
1.功能:对磁盘进行格式化,划分磁道和扇区;同时检查出整个磁盘上有无带缺陷的磁道,对坏道加注标记;建立目录区和文件分配表,使磁盘作好接收DOS的准备。
2.类型:外部命令
3.格式:formAT〈盘符:〉[/S][/4][/Q]
4.使用说明:
(1)命令后的盘符不可缺省,若对硬盘进行格式化,则会如下列提示:WARNING:ALL DATA ON NON
——REMOVABLE DISK
DRIVE C:WILL BE LOST !
Proceed with format (Y/N)?
(警告:所有数据在C盘上,将会丢失,确实要继续格式化吗?)
(2)若是对软盘进行格式化,则会如下提示:Insert mew diskette for drive A;
and press ENTER when ready…
(在A驱中插入新盘,准备好后按回车键)。
(3)选用[/S]参数,将把DOS系统文件IO.SYS
、MSDOS.SYS及COMMAND.COM复制到磁盘上,使该磁盘可以做为DOS启动盘。若不选用/S参数,则格式化后的磙盘只能读写信息,而不能做为启动盘;
(4)选用[/4]参数,在1.2MB的高密度软驱中格式化360KB的低密度盘;
(5)选用[/Q]参数,快速格式化,这个参数并不会重新划分磁盘的磁道貌岸然和扇区,只能将磁盘根目录、文件分配表以及引导扇区清成空白,因此,格式化的速度较快。
(6)选用[/U]参数,表示无条件格式化,即破坏原来磁盘上所有数据。不加/U,则为安全格式化,这时先建立一个镜象文件保存原来的FAT表和根目录,必要时可用UNFORRMAT恢复原来的数据。
(二)UNformAT恢复格式化命令
1.功能:对进行过格式化误操作丢失数据的磁盘进行恢复。
2.类型:外部命令
3.格式:UNformAT〈盘符〉[/L][/U][/P][/TEST]
4.使用说明:用于将被“非破坏性”格式化的磁盘恢复。根目录下被删除的文件或子目录及磁盘的系统扇区(包括FAT、根目录、BOOT扇区及硬盘分区表)受损时,也可以用UNformAT来抢救。
(1)选用/L参数列出找到的子目录名称、文件名称、大孝日期等信息,但不会真的做formAT工作。
(2)选用/P参数将显示于屏幕的报告(包含/L参数所产生的信息)同时也送到打印机。运行时屏幕会显示:“Print out will
be sent to LPT1”
(3)选用/TEST参数只做模拟试验(TEST)不做真正的写入动作。使用此参数屏幕会显示:“Simulation only”
(4)选用/U参数不使用MIRROR映像文件的数据,直接根据磁盘现状进行UNformAT。
(5)选用/PSRTN;修复硬盘分区表。
若在盘符之后加上/P、/L、/TEST之一,都相当于使用了/U参数,UNformAT会“假设”此时磁盘没有MIRROR映像文件。
注意:UNformAT对于刚formAT的磁盘,可以完全恢复,但formAT后若做了其它数据的写入,则UNformAT就不能完整的救回数据了。UNformAT并非是万能的,由于使用UNformAT会重建FAT与根目录,所以它也具有较高的危险性,操作不当可能会扩大损失,如果仅误删了几个文件或子目录,只需要利用UNDELETE就够了。
三) CHKDSK——检查磁盘当前状态命令
1.功能:显示磁盘状态、内存状态和指定路径下指定文件的不连续数目。
2.类型:外部命令
3.格式:CHKDSK [盘符:][路径][文件名][/F][/V]
4.使用说明:
(1)选用[文件名]参数,则显示该文件占用磁盘的情况;
(2)选[/F]参数,纠正在指定磁盘上发现的逻辑错误;
(3)选用[/V]参数,显示盘上的所有文件和路径。
(四)DISKCOPY——整盘复制命令
1.功能:复制格式和内容完全相同的软盘。
2.类型:外部命令
3.格式:DISKCOPY[盘符1:][盘符2:]
4.使用说明:
(1)如果目标软盘没有格式化,则复制时系统自动选进行格式化。
(2)如果目标软盘上原有文件,则复制后将全部丢失。
(3)如果是单驱动器复制,系统会提示适时更换源盘和目标盘,请操作时注意分清源盘和目标盘。
(五)LABEL——建立磁盘卷标命令
1.功能:建立、更改、删除磁盘卷标。
2.类型:外部命令
3.格式:LABEL[盘符:][卷标名]
4.使用说明:
(1)卷标名为要建立的卷标名,若缺省此参数,则系统提示键入卷标名或询问是否删除原有的卷标名;
(2)卷标名由1至11个字符组成。
(六)VOL——显示磁盘卷标命令
1.功能:查看磁盘卷标号。
2.类型:内部命令
3.格式:VOL[盘符:]
4.使用说明:省略盘符,显示当前驱动器卷标。
(七)SCANDISK——检测、修复磁盘命令
1.功能:检测磁盘的FAT表、目录结构、文件系统等是否有问题,并可将检测出的问题加以修复。
2.类型:外部命令
3.格式:SCANDISK[盘符1:]{[盘符2:]…}[/ALL]
4.使用说明:
(1)CCANDISK适用于硬盘和软盘,可以一次指定多个磁盘或选用[/ALL]参数指定所有的磁盘;
(2)可自动检测出磁盘中所发生的交叉连接、丢失簇和目录结构等逻辑上的错误,并加以修复。
(八)DEFRAG——重整磁盘命令
1.。功能:整理磁盘,消除磁盘碎块。
2.类型:外部命令
3.格式:DEFRAG[盘符:][/F]
4.使用说明:选用/F参数,将文件中存在盘上的碎片消除,并调整磁盘文件的安排,确保文件之间毫无空隙。从而加快读盘速度和节省磁盘空间。
(九)SYS——系统复制命令
1.功能:将当前驱动器上的DOS系统文件IO.SYS,MSDOS.SYS和COMMAND.COM 传送到指定的驱动器上。
2.类型:外部命令
3.格式:SYS[盘符:]
*使用说明:如果磁盘剩余空间不足以存放系统文件,则提示:No roomfor on destination disk.

文件操作类命令
(一) COPY文件复制命令
1.功能:拷贝一个或多个文件到指定盘上。
2.类型:内部命令
3.格式:COPY [源盘][路径]〈源文件名〉[目标盘][路径][目标文件名]
4.使用说明:
(1)COPY是文件对文件的方式复制数据,复制前目标盘必须已经格式化;
(2)复制过程中,目标盘上相同文件名称的旧文件会被源文件取代;
(3)复制文件时,必须先确定目标般有足够的空间,否则会出现;insufficient的错误信息,提示磁盘空间不够;
(4)文件名中允许使用通配举“*”“?”,可同时复制多个文件;
(5)COPY命令中源文件名必须指出,不可以省略。
(6)复制时,目标文件名可以与源文件名相同,称作“同名拷贝”此时目标文件名可以省略;
(7)复制时,目标文件名也可以与源文件名不相同,称作“异名拷贝”,此时,目标文件名不能省略;
(8)复制时,还可以将几个文件合并为一个文件,称为“合并拷贝”,格式如下:COPY;[源盘][路径]〈源文件名1〉〈源文件名2〉…[目标盘][路径]〈目标文件名〉;
(9)利用COPY命令,还可以从键盘上输入数据建立文件,格式如下:COPY CON [盘符:][路径]〈文件名〉;
(10)注意:COPY命令的使用格式,源文件名与目标文件名之间必须有空格!
(二)XCOPY——目录复制命令
1.功能:复制指定的目录和目录下的所有文件连同目录结构。
2.类型:外部命令
3.格式:XCOPY [源盘:]〈源路径名〉[目标盘符:][目标路径名][/S][/V][/E]
4.使用说明:
(1)XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝隐藏文件和系统文件;
(2)使用时源盘符、源目标路径名、源文件名至少指定一个;
(3)选用/S时对源目录下及其子目录下的所有文件进行COPY。除非指定/E参数,否则/S不会拷贝空目录,若不指定/S参数,则XCOPY只拷贝源目录本身的文件,而不涉及其下的子目录;
(4)选用/V参数时,对的拷贝的扇区都进行较验,但速度会降低。
(三)TYPE——显示文件内容命令
1.功能:显示ASCII码文件的内容。
2.类型:内部命令。
3.格式:TYPE[盘符:][路径]〈文件名〉
4.使用说明:
(1)显示由ASCII码组成的文本文件,对。EXE.COM等为扩展名的文件,其显示的内容是无法阅读的,没有实际意义2;
(2)该命令一次只可以显示一个文件的内容,不能使用通配符;
(3)如果文件有扩展名,则必须将扩展名写上;
(4)当文件较长,一屏显示不下时,可以按以下格式显示;TYPE[盘符:][路径]〈文件名〉|MORE,MORE为分屏显示命令,使用些参数后当满屏时会暂停,按任意键会继续显示。
(5)若需将文件内容打印出来,可用如下格式:
TYPE[盘符:][路径]〈文件名〉,>PRN
此时,打印机应处于联机状态。
(四) REN——文件改名命令
1.功能:更改文件名称
2.类型:内部命令
3.格式:REN[盘符:][路径]〈旧文件名〉〈新文件名〉
4.使用说明:
(1)新文件名前不可以加上盘符和路径,因为该命令只能对同一盘上的文件更换文件名;
(2)允许使用通配符更改一组文件名或扩展名。
(五)FC——文件比较命令
1.功能:比较文件的异同,并列出差异处。
2.类型:外部命令
3.格式:FC[盘符:][路径名]〈文件名〉[盘符:][路径名][文件名][/A][/B][/C][/N]
4.使用说明:
(1)选用/A参数,为ASCII码比较模式;
(2)选用/B参数,为二进制比较模式;
(3)选用/C参数,将大小写字符看成是相同的字符。
(4)选用/N参数,在ASCII码比较方式下,显示相异处的行号。
(六)ATTRIB——修改文件属性命令
1.功能:修改指定文件的属性。(文件属性参见2.5.4(二)文件属性一节)
2.类型:外部命令。
3.格式:ATTRIB[文件名][R][——R][A][——A][H][——H][——S]
4.使用说明:
(1)选用R参数,将指定文件设为只读属性,使得该文件只能读取,无法写入数据或删除;选用——R参数,去除只读属性;
(2)选用A参数,将文件设置为档案属性;选用——A参数,去除档案属性; (3)选用H参数,将文件调协为隐含属性;选用——H参数,去隐含属性;
(4)选用S参数,将文件设置为系统属性;选用——S参数,去除系统属性; (5)选用/S参数,对当前目录下的所有子目录及作设置。
七) DEL——删除文件命令
1.功能:删除指定的文件。
2.类型:内部命令
3.格式:DEL[盘符:][路径]〈文件名〉[/P]
4.使用说明:
(1)选用/P参数,系统在删除前询问是否真要删除该文件,若不使用这个参数,则自动删除;
(2)该命令不能删除属性为隐含或只读的文件;
(3)在文件名称中可以使用通配符;
(4)若要删除磁盘上的所有文件(DEL*·*或DEL·),则会提示:(Arey ou sure?)(你确定吗?)若回答Y,则进行删除,回答N,则取消此次删除作业。
(八) UNDELETE——恢复删除命令
1.功能:恢复被误删除命令
2.类型:外部命令。
3.格式:UNDELETE[盘符:][路径名]〈文件名〉[/DOS]/LIST][/ALL]
4.使用说明:使用UNDELETE可以使用“*”和“?”通配符。
(1)选用/DOS参数根据目录里残留的记录来恢复文件。由于文件被删除时,目录所记载斩文件名第一个字符会被改为E5,DOS即依据文件开头的E5和其后续的字符来找到欲恢复的文件,所以,UNDELETE会要求用户输入一个字符,以便将文件名字补齐。但此字符不必和原来的一样,只需符合DOS的文件名规则即可。
(2)选用/LIST只“列出”符合指定条件的文件而不做恢复,所以对磁盘内容完全不会有影响。
(3)选用/ALL自动将可完全恢复的文件完全恢复,而不一一地询问用户,使用此参数时,若UNDELTE利用目录里残留的记录来将文件恢复,则会自动选一个字符将文件名补齐,并且使其不与现存文件名相同,选用字符的优选顺序为:#%——0000123456789A~Z。



UNDELETE还具有建立文件的防护措施的功能,已超出本课程授课范围,请读者在使用些功能时查阅有关DOS手册。

七、其它命令
(一)CLS——清屏幕命令
1功能:清除屏幕上的所有显示,光标置于屏幕左上角。
2类型:内部命令
3格式:CLS
(二) VER查看系统版本号命令
1功能:显示当前系统版本号
2类型:内部命令
3格式:VER
(三) DATA日期设置命令
1功能:设置或显示系统日期。
2类型:内部命令
3格式:DATE[mm——dd——yy]
4使用说明:
(1)省略[mm——dd——yy]显示系统日期并提示输入新的日期,不修改则可直接按回车键,[mm——dd——yy]为“月月——日日——年年”格式;
(2)当机器开始启动时,有自动处理文件(AUTOEXEC.BAT)被执行,则系统不提示输入系统日期。否则,提示输入新日期和时间。
(四) TIME系统时钟设置命令
1功能:设置或显示系统时期。
2类型:内部命令
3格式:TIME[hh:mm:ss:xx]
4使用说明:
(1)省略[hh:mm:ss:xx],显示系统时间并提示输入新的时间,不修改则可直接按回车键,[hh:mm:ss:xx]为“小时:分钟:秒:百分之几秒”格式;
(2)当机器开始启动时,有自动处理文件(AUTOEXEC.BAT)被执行,则系统不提示输入系统日期。否则,提示输入新日期和时间。
(五)MEM查看当前内存状况命令
1功能:显示当前内存使用的情况
2类型:外部命令
3格式:MEM[/C][/F][/M][/P]
4使用说明:
(1)选用/C参数列出装入常规内存和CMB的各文件的长度,同时也显示内存空间的使用状况和最大的可用空间;
(2)选用/F参数分别列出当前常规内存剩余的字节大小和UMB可用的区域及大小;
(3)选用/M参数显示该模块使用内存地地址、大小及模块性质;
(4)选用/P参数指定当输出超过一屏时,暂停供用户查看。
(六) MSD显示系统信息命令
1功能:显示系统的硬件和操作系统的状况。
2类型:外部命令
3格式:MSD[/I][/B][/S]
4使用说明:
(1)选用/I参数时,不检测硬件;
(2)选用/B参数时,以黑白方式启动MSD;
(3)选用/S参数时,显示出简明的系统报告。

posted @ 2008-06-30 10:46 sunny spring 阅读(118) | 评论 (0)编辑 收藏

Windows下的DOS命令

wmimgmt.msc----------打开windows管理体系结构(wmi)
  wupdmgr----------windows更新程序
  write----------写字板
  winmsd----------系统信息
  wiaacmgr----------扫描仪和照相机向导
  winchat----------xp自带局域网聊天
msconfig.exe----------系统配置实用程序
  mplayer2----------简易widnows media player
  mspaint----------画图板
  mstsc----------远程桌面连接
  mplayer2----------媒体播放机
  magnify----------放大镜实用程序
  mmc-----------打开控制台
  mobsync----------同步命令
dxdiag----------检查directx信息
  drwtsn32------ ----系统医生
  devmgmt.msc--- -------设备管理器
  dfrg.msc----------磁盘碎片整理程序
  diskmgmt.msc----------磁盘管理实用程序
  dcomcnfg----------打开系统组件服务
  ddeshare----------打开dde共享设置
  dvdplay----------dvd播放器
net stop messenger----停止信使服务
  net start messenger---开始信使服务
  notepad----------打开记事本
  nslookup----------网络管理的工具向导
  ntbackup----------系统备份和还原
  narrator----------屏幕“讲述人”
  ntmsmgr.msc----------移动存储管理器
  ntmsoprq.msc----------移动存储管理员操作请求
  netstat -an---------(tc)命令检查接口
syncapp----------创建一个公文包
  sysedit----------系统配置编辑器
  sigverif----------文件签名验证程序
  sndrec32----------录音机
  shrpubw----------创建共享文件夹
  secpol.msc----------本地安全策略
  syskey----------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
  services.msc----------本地服务设置
  sndvol32----------音量控制程序
  sfc.exe----------系统文件检查器
  sfc /scannow----------windows文件保护
tsshutdn----------60秒倒计时关机命令
  tourstart----------xp简介(安装完成后出现的漫游xp程序)
  taskmgr----------任务管理器
eventvwr----------事件查看器
  eudcedit----------造字程序
  explorer----------打开资源管理器
packager----------对象包装程序
  perfmon.msc----------计算机性能监测程序
  progman----------程序管理器
regedit.exe----------注册表
  rsop.msc----------组策略结果集
  regedt32----------注册表编辑器
  rononce -p ---------15秒关机
  regsvr32 /u *.dll----停止dll文件运行
  regsvr32 /u zipfldr.dll--取消zip支持
cmd.exe----------cmd命令提示符
  chkdsk.exe----------chkdsk磁盘检查
  certmgr.msc----------证书管理实用程序
  calc------------启动计算器
  charmap----------启动字符映射表
  cliconfg----------sql server 客户端网络实用程序
  clipbrd----------剪贴板查看器
  conf-----------启动netmeeting
  compmgmt.msc----------计算机管理
  cleanmgr----------垃圾整理
  ciadv.msc----------索引服务程序
osk-----------打开屏幕键盘
  odbcad32----------odbc数据源管理器
  oobe/msoobe /a-------检查xp是否激活
  lusrmgr.msc----------本机用户和组
  logoff----------注销命令
iexpress----------木马捆绑工具,系统自带
nslookup----------ip地址侦测器
fsmgmt.msc----------共享文件夹管理器
utilman----------辅助工具管理器
gpedit.msc----------组策略
FDISK/MBR----------------(将硬盘主引导程序直接重写)
GPEDIT.MSC---------------(在运行中打开计算机管理器)
MSCONFIG-----------------(在运行中打开启动)

posted @ 2008-06-30 10:39 sunny spring 阅读(139) | 评论 (0)编辑 收藏

jsp下载文件问题

      今天在公司做了一个上传和下载的后台页面,但是我下载不同格式的文件的时候有的文件能下载,有的格式的文件就不能下载.原来是在文件中没有配置相应的下载文件类型参数.我在网上找了一些资料没有几个说清楚的.我今天就把此设置贴出来以供大家参考.
首先到tomcat/conf/web.xml找到这个文件.在这个文件的<welcome-file-list>之前加入以下代码:
<mime-mapping>  
<extension>mht</extension>  
<mime-type>text/x-mht</mime-type>  
</mime-mapping>  
<mime-mapping>  
               <extension>rar</extension>  
               <mime-type>application/octet-stream</mime-type>  
       </mime-mapping>  
       <mime-mapping>  
               <extension>iso</extension>  
               <mime-type>application/octet-stream</mime-type>  
       </mime-mapping>  
       <mime-mapping>  
               <extension>ape</extension>  
               <mime-type>application/octet-stream</mime-type>  
       </mime-mapping>  
       <mime-mapping>  
               <extension>rmvb</extension>  
               <mime-type>application/octet-stream</mime-type>  
       </mime-mapping>  
       <mime-mapping>  
               <extension>ico</extension>  
               <mime-type>image/x-icon</mime-type>  
       </mime-mapping>  
要是其它格式的文件也是类似的配置,只是参数不同而已!!

posted @ 2008-06-26 13:39 sunny spring 阅读(1757) | 评论 (3)编辑 收藏

Eclipse快捷键与插件

Ctrl+1
快速修复

Ctrl+D
删除当前行

Ctrl+Alt+↓
复制当前行到下一行(复制增加)

Ctrl+Alt+↑
复制当前行到上一行(复制增加)

Alt+↓
当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)

Alt+↑
当前行和上面一行交互位置

Alt+←
前一个编辑的页面

Alt+→
下一个编辑的页面

Alt+Enter
显示当前选择资源(工程,or 文件 or文件)的属性

Shift+Enter
在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)

Shift+Ctrl+Enter
在当前行插入空行(原理同上条)

Ctrl+Q
定位到最后编辑的地方

Ctrl+L
定位在某行 

Ctrl+M
最大化当前的Edit或View

Ctrl+/
注释当前行,再按则取消注释

Ctrl+O
快速显示 OutLine

Ctrl+T
快速显示当前类的继承结构

Ctrl+W
关闭当前Editer

Ctrl+K
参照选中的Word快速定位到下一个

Ctrl+E
快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)

Ctrl+/
(小键盘) 折叠当前类中的所有代码

Ctrl+×
(小键盘) 展开当前类中的所有代码

Ctrl+Space
代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)

Ctrl+Shift+E
显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)

Ctrl+J
正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)

Ctrl+Shift+J
反向增量查找(和上条相同,只不过是从后往前查)

Ctrl+Shift+F4
关闭所有打开的Editer

Ctrl+Shift+X
把当前选中的文本全部变味小写

Ctrl+Shift+Y
把当前选中的文本全部变为小写

Ctrl+Shift+F
格式化当前代码

Ctrl+Shift+P
定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)

下面的快捷键是重构里面常用的 (注:一般重构的快捷键都是Alt+Shift开头的了)

Alt+Shift+R
重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)

Alt+Shift+M
抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)

Alt+Shift+C
修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)

Alt+Shift+L
抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)

Alt+Shift+F
把Class中的local变量变为field变量

Alt+Shift+I
合并变量(可能这样说有点不妥Inline)

Alt+Shift+V
移动函数和变量

Alt+Shift+Z
重构的后悔药

---------------------------------------------------------------------------------------------------------------------

Eclipse插件下载

1   Eclipse下载
EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在这里下载
http://www.eclipse.org/downloads/index.php

2   lomboz J2EE插件,开发JSP,EJB
http://forge.objectweb.org/projects/lomboz


3   MyEclipse J2EE开发插件,支持SERVLET/JSP/EJB/数据库操纵等
http://www.myeclipseide.com

4   Properties Editor   编辑java的属性文件,并可以自动存盘为Unicode格式
http://propedit.sourceforge.jp/index_en.html

5   Colorer Take   为上百种类型的文件按语法着色
http://colorer.sourceforge.net/

6   XMLBuddy 编辑xml文件
http://www.xmlbuddy.com

7   Code Folding   加入多种代码折叠功能(比eclipse自带的更多)
http://www.coffee-bytes.com/servlet/PlatformSupport

8   Easy Explorer   从eclipse中访问选定文件、目录所在的文件夹
http://easystruts.sourceforge.net/

9   Fat Jar 打包插件,可以方便的完成各种打包任务,可以包含外部的包等
http://fjep.sourceforge.net/

10   RegEx Test 测试正则表达式
http://brosinski.com/stephan/archives/000028.php

11   JasperAssistant 报表插件(要钱的哦~)
http://www.jasperassistant.com/

12   Jigloo GUI Builder JAVA的GUI编辑插件
http://cloudgarden.com/jigloo/

13   Profiler 性能跟踪、测量工具,能跟踪、测量B/S程序
http://sourceforge.net/projects/eclipsecolorer/

14   AdvanQas 提供对if/else等条件语句的提示和快捷帮助(自动更改结构等)
http://eclipsecolorer.sourceforge.net/advanqas/index.html

15   Log4E Log4j插件,提供各种和Log4j相关的任务,如为方法、类添加一个logger等
http://log4e.jayefem.de/index.php/Main_Page

16   VSSPlugin VSS插件
http://sourceforge.net/projects/vssplugin

17   Implementors 提供跳转到一个方法的实现类,而不是接口的功能(实用!)
http://eclipse-tools.sourceforge.net/implementors/

18   Call Hierarchy 显示一个方法的调用层次(被哪些方法调,调了哪些方法)
http://eclipse-tools.sourceforge.net/call-hierarchy/index.html

19   EclipseTidy 检查和格式化HTML/XML文件
http://eclipsetidy.sourceforge.net/

20   Checkclipse 检查代码的风格、写法是否符合规范
http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm

21   Hibernate Synchronizer Hibernate插件,自动映射等
http://www.binamics.com/hibernatesync/

22   VeloEclipse   Velocity插件
http://propsorter.sourceforge.net/
 
23   EditorList 方便的列出所有打开的Editor
http://editorlist.sourceforge.net/
 
24   MemoryManager 内存占用率的监视
http://cloudgarden.com/memorymanager/

25   swt-designer java的GUI插件
http://www.swt-designer.com/

26   TomcatPlugin 支持Tomcat插件
http://www.sysdeo.com/eclipse/tomcatPlugin.html

27   XML Viewer
http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html

28   quantum 数据库插件
http://quantum.sourceforge.net/

29   Dbedit 数据库插件
http://sourceforge.net/projects/dbedit

30   clay.core 可视化的数据库插件
http://www.azzurri.jp/en/software/index.jsp
http://www.azzurri.jp/eclipse/plugins

31   hiberclipse hibernate插件
http://hiberclipse.sourceforge.net
http://www.binamics.com/hibernatesync

32   struts-console Struts插件
http://www.jamesholmes.com/struts/console/

33   easystruts Struts插件
http://easystruts.sourceforge.net

34   veloedit Velocity插件
http://veloedit.sourceforge.net/

35   jalopy 代码整理插件
http://jalopy.sourceforge.net/

36   JDepend 包关系分析
http://andrei.gmxhome.de/jdepend4eclipse/links.html

37   Spring IDE Spring插件
http://springide-eclip.sourceforge.net/updatesite/

38   doclipse 可以产生xdoclet 的代码提示
http://beust.com/doclipse/

39   SQLExplorer,在Eclipse 中连接各种数据库进行操作使用
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=31124

posted @ 2008-01-16 12:34 sunny spring 阅读(252) | 评论 (0)编辑 收藏

关于SQL挂起的解决办法

打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ Session Manager中找到PendingFileRenameOperations项目,并删除它。这样就可以清除安装暂挂项目。

posted @ 2008-01-16 12:33 sunny spring 阅读(265) | 评论 (0)编辑 收藏