Java Blog From WeiChunHua

Java

常用链接

统计

develop

news

最新评论

2008年12月17日 #

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 阅读(208) | 评论 (0)编辑 收藏

2008年12月2日 #

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 阅读(200) | 评论 (0)编辑 收藏

2008年12月1日 #

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 阅读(176) | 评论 (0)编辑 收藏

2008年11月21日 #

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 阅读(4305) | 评论 (2)编辑 收藏

2008年11月19日 #

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 阅读(189) | 评论 (0)编辑 收藏

2008年6月30日 #

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 阅读(250) | 评论 (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 阅读(225) | 评论 (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 阅读(206) | 评论 (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 阅读(362) | 评论 (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 阅读(5180) | 评论 (1)编辑 收藏

仅列出标题  下一页