<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java Blog From WeiChunHua

    Java

    常用鏈接

    統(tǒng)計

    develop

    news

    最新評論

    2008年12月17日 #

    JDBC連接數據庫大全

              現(xiàn)在有好多初學jsp的網友經常會問數據庫怎么連接啊,怎么老出錯啊?所以我集中的在這寫篇文章供大家參考,其實這種把數據庫邏輯全部放在jsp里未必是好的做法,但是有利于初學者學習,所以我就這樣做了,當大家學到一定程度的時候,可以考慮用MVC的模式開發(fā)。在練習這些代碼的時候,你一定將jdbc的驅動程序放到服務器的類路徑里,然后要在數據庫里建一個表test,有兩個字段比如為test1test2,可以用下面SQL
    create table test(test1 varchar(20),test2 varchar(20)
    然后向這個表寫入一條測試紀錄
    那么現(xiàn)在開始我們的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 閱讀(311) | 評論 (0)編輯 收藏

    2008年12月2日 #

    Hibernate入門程序

           以下程序是Hiberante入門程序:代碼如下:首先說hibernate開發(fā)流程.A、準備一個POJO類  B、創(chuàng)建類的映射和配置文件(hibernate.cfg.xml  class.hbm.xml)class.hbm.xml此配置文件是必須與POJO類中的屬性一一對應.
    現(xiàn)在我以我創(chuàng)建的程序為例來進行說明:數據庫為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、創(chuàng)建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、創(chuàng)建應用程序并進行代碼測試:

    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();
      // 創(chuàng)建工廠
      SessionFactory factory = config.buildSessionFactory();
      // 打開session
      Session session = factory.openSession();
      // 事務提交
      try{
       Transaction tx = session.beginTransaction();
       // 創(chuàng)建對象
       Admin hb = new Admin();
       hb.setId(3);
       hb.setUsername("Hibernate3.2");
       hb.setPassword("20081202");
       //hb.setUsername("WCH");
       //hb.setPassword("Hibernate");
       // 執(zhí)行插入語句,在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 閱讀(277) | 評論 (0)編輯 收藏

    2008年12月1日 #

    windows系統(tǒng)命令全集

    ASSOC    顯示或修改文件擴展名關聯(lián)。
    AT       計劃在計算機上運行的命令和程序。
    ATTRIB   顯示或更改文件屬性。
    BREAK    設置或清除擴展式 CTRL+C 檢查。
    CACLS    顯示或修改文件的訪問控制列表(ACLs)。
    CALL     從另一個批處理程序調用這一個。
    CD       顯示當前目錄的名稱或將其更改。
    CHCP     顯示或設置活動代碼頁數。
    CHDIR    顯示當前目錄的名稱或將其更改。
    CHKDSK   檢查磁盤并顯示狀態(tài)報告。
    CHKNTFS  顯示或修改啟動時間磁盤檢查。
    CLS      清除屏幕。
    CMD      打開另一個 Windows 命令解釋程序窗口。
    COLOR    設置默認控制臺前景和背景顏色。
    COMP     比較兩個或兩套文件的內容。
    COMPACT  顯示或更改 NTFS 分區(qū)上文件的壓縮。
    CONVERT  將 FAT 卷轉換成 NTFS。您不能轉換
             當前驅動器。
    COPY     將至少一個文件復制到另一個位置。
    DATE     顯示或設置日期。
    DEL      刪除至少一個文件。
    DIR      顯示一個目錄中的文件和子目錄。
    DISKCOMP 比較兩個軟盤的內容。
    DISKCOPY 將一個軟盤的內容復制到另一個軟盤。
    DOSKEY   編輯命令行、調用 Windows 命令并創(chuàng)建宏。
    ECHO     顯示消息,或將命令回顯打開或關上。
    ENDLOCAL 結束批文件中環(huán)境更改的本地化。
    ERASE    刪除至少一個文件。
    EXIT     退出 CMD.EXE 程序(命令解釋程序)。
    FC       比較兩個或兩套文件,并顯示
             不同處。
    FIND     在文件中搜索文字字符串。
    FINDSTR  在文件中搜索字符串。
    FOR      為一套文件中的每個文件運行一個指定的命令。
    FORMAT   格式化磁盤,以便跟 Windows 使用。
    FTYPE    顯示或修改用于文件擴展名關聯(lián)的文件類型。
    GOTO     將 Windows 命令解釋程序指向批處理程序
             中某個標明的行。
    GRAFTABL 啟用 Windows 來以圖像模式顯示
             擴展字符集。
    HELP     提供 Windows 命令的幫助信息。
    IF       執(zhí)行批處理程序中的條件性處理。
    LABEL    創(chuàng)建、更改或刪除磁盤的卷標。
    MD       創(chuàng)建目錄。
    MKDIR    創(chuàng)建目錄。
    MODE     配置系統(tǒng)設備。
    MORE     一次顯示一個結果屏幕。
    MOVE     將文件從一個目錄移到另一個目錄。
    PATH     顯示或設置可執(zhí)行文件的搜索路徑。
    PAUSE    暫停批文件的處理并顯示消息。
    POPD     還原 PUSHD 保存的當前目錄的上一個值。
    PRINT    打印文本文件。
    PROMPT   更改 Windows 命令提示符。
    PUSHD    保存當前目錄,然后對其進行更改。
    RD       刪除目錄。
    RECOVER  從有問題的磁盤恢復可讀信息。
    REM      記錄批文件或 CONFIG.SYS 中的注釋。
    REN      重命名文件。
    RENAME   重命名文件。
    REPLACE  替換文件。
    RMDIR    刪除目錄。
    SET      顯示、設置或刪除 Windows 環(huán)境變量。
    SETLOCAL 開始批文件中環(huán)境更改的本地化。
    SHIFT    更換批文件中可替換參數的位置。
    SORT     對輸入進行分類。
    START    啟動另一個窗口來運行指定的程序或命令。
    SUBST    將路徑跟一個驅動器號關聯(lián)。
    TIME     顯示或設置系統(tǒng)時間。
    TITLE    設置 CMD.EXE 會話的窗口標題。
    TREE     以圖形模式顯示驅動器或路徑的目錄結構。
    TYPE     顯示文本文件的內容。
    VER      顯示 Windows 版本。
    VERIFY   告訴 Windows 是否驗證文件是否已正確
             寫入磁盤。
    VOL      顯示磁盤卷標和序列號。
    XCOPY    復制文件和目錄樹。

    posted @ 2008-12-01 15:58 sunny spring 閱讀(250) | 評論 (0)編輯 收藏

    2008年11月21日 #

    quartz 詳解

             最近在開發(fā)的過程中,經常要使用系統(tǒng)自動清零的操作,比如說:系統(tǒng)在給定的時間跟客戶發(fā)送電子郵件,在指定的時間段內執(zhí)行某些操作等等,如果我們只是人工去操作的話不但步驟非常的麻煩而且覺得這是一個工作量非常大的任務,有了quartz框架以后我們所有的任務多可以交給它去做,程序員唯一要做的只是編寫代碼并配置一下程序就OK了,這樣大大提高了開發(fā)速度和工作效率.配置步驟如下:
    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表示間斷啟動時間  ?表示執(zhí)行間隔時間  13啟動時間-->
                      <cron-expression>0 1/2 23 * * ?</cron-expression>
                      <!--每月1號0點執(zhí)行
                       <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文件中在指定的時間內就會執(zhí)行系統(tǒng)調度.
    <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 閱讀(4509) | 評論 (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 閱讀(245) | 評論 (0)編輯 收藏

    2008年6月30日 #

    CSS 全解

    CSS在英文中有如下幾種常見的縮寫:

    1,Cascading Style Sheets 層疊樣式表

    2,Content Scrambling System DVD電影的加密系統(tǒng)

    3,Cast Semi-Steel 半鑄鋼, 鋼性鑄鐵

    4,College Scholarship Service 大學獎學金處



    其中在網絡上最常見的是Cascading Style Sheets(層疊樣式表)

    感性體驗CSS


    什么是CSS呢?你可能急迫的想知道答案。但是空泛的文字描述意義不大,讓我們先來一點感性體驗吧。看看這個沒有添加CSS的HTML文件:http://www.csszengarden.com/zengarden-sample.html
    是一個普普通通的網頁。然而通過給這個文件添加的CSS規(guī)則,我們可以得到十分美觀的網頁:http://www.csszengarden.com/

    這還不是全部,不改動HTML,只是通過添加不同的CSS規(guī)則,我們就可以得到各種不同樣式的網頁:
    http://www.csszengarden.com/?cssfile=/208/208.css&page=0
    好了,下面我們再來回答什么是CSS這個問題。

    什么是Cascading Style Sheets(層疊樣式表)

    * CSS是Cascading Style Sheets(層疊樣式表)的簡稱.
    * CSS語言是一種標記語言,它不需要編譯,可以直接由瀏覽器執(zhí)行(屬于瀏覽器解釋型語言).
    * 在標準網頁設計中CSS負責網頁內容(XHTML)的表現(xiàn).
    * CSS文件也可以說是一個文本文件,它包含了一些CSS標記,CSS文件必須使用css為文件名后綴.
    * 可以通過簡單的更改CSS文件,改變網頁的整體表現(xiàn)形式,可以減少我們的工作量,所以她是每一個網頁設計人員的必修課.
    * CSS是由W3C的CSS工作組產生和維護的.
    如何將樣式表加入到網頁
    可以用以下三種方式將樣式表加入您的網頁。而最接近目標的樣式定義優(yōu)先權越高。高優(yōu)先權樣式將繼承低優(yōu)先權樣式的未重疊定義但覆蓋重疊的定義。例外請參閱 !important 聲明。

    鏈入外部樣式表文件 (Linking to a Style Sheet)
    你可以先建立外部樣式表文件(.css),然后使用HTML的link對象。示例如下:
    <head>
    <title>文檔標題</title>
    <link rel=stylesheet type="text/css">
    </head>
    而在XML中,你應該如下例所示在聲明區(qū)中加入:
    <? xml-stylesheet type="text/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",是允許不支持這類型的瀏覽器忽略樣式表單。

    內聯(lián)定義 (Inline Styles)
    內聯(lián)定義即是在對象的標記內使用對象的style屬性定義適用其的樣式表屬性。示例如下:
    這一行被增加了左右的外補丁


    Cascading Style Sheets(層疊樣式表)的歷史
    從1990年代初HTML被發(fā)明開始樣式表就以各種形式出現(xiàn)了,不同的瀏覽器結合了它們各自的樣式語言,讀者可以使用這些樣式語言來調節(jié)網頁的顯示方式。一開始樣式表是給讀者用的,最初的HTML版本只含有很少的顯示屬性,讀者來決定網頁應該怎樣被顯示。
    但隨著HTML的成長,為了滿足設計師的要求,HTML獲得了很多顯示功能。隨著這些功能的增加外來定義樣式的語言越來越沒有意義了。
    1994年哈坤·利提出了CSS的最初建議。伯特·波斯(Bert Bos)當時正在設計一個叫做Argo的瀏覽器,他們決定一起合作設計CSS。
    當時已經有過一些樣式表語言的建議了,但CSS是第一個含有“層疊”的主意的。在CSS中,一個文件的樣式可以從其它的樣式表中繼承下來。讀者在有些地方可以使用他自己更喜歡的樣式,在其他地方則繼承,或“層疊”作者的樣式。這種層疊的方式使作者和讀者都可以靈活地加入自己的設計,混合各人的愛好。
    哈坤于1994年在芝加哥的一次會議上第一次展示了CSS的建議,1995年他與波斯一起再次展示這個建議。當時W3C剛剛建立,W3C對CSS的發(fā)展很感興趣,它為此組織了一次討論會。哈坤、波斯和其他一些人(比如微軟的托馬斯·雷爾登)是這個項目的主要技術負責人。1996年底,CSS已經完成。1996年12月CSS要求的第一版本被出版。
    1997年初,W3C內組織了專門管CSS的工作組,其負責人是克里斯·里雷。這個工作組開始討論第一版中沒有涉及到的問題,其結果是1998年5月出版的第二版要求。到2004年為止,第三版還未出版。

    * 1996年W3C正式推出了CSS1.
    * 1998年W3C正式推出了CSS2.
    * CSS2.1是W3C現(xiàn)在正在推薦使用的.
    * CSS3現(xiàn)在還處于開發(fā)中.

    網頁設計中常用的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. 樣式表的層疊性
      層疊性就是繼承性,樣式表的繼承規(guī)則是外部的元素樣式會保留下來繼承給這個元素所包含的其他元素。事實上,所有在元素中嵌套的元素都會繼承外層元素指定的屬性值,有時會把很多層嵌套的樣式疊加在一起,除非另外更改。例如在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屬性則依照最后定義的。
      不同的選擇符定義相同的元素時,要考慮到不同的選擇符之間的優(yōu)先級。ID選擇符,類選擇符和HTML標記選擇符,因為ID選擇符是最后加上元素上的,所以優(yōu)先級最高,其次是類選擇符。如果想超越這三者之間的關系,可以用!important提升樣式表的優(yōu)先權,例如:
      p { color: #FF0000!important }
      .blue { color: #0000FF}
      #id1 { color: #FFFF00}
      我們同時對頁面中的一個段落加上這三種樣式,它最后會依照被!important申明的HTML標記選擇符樣式為紅色文字。如果去掉!important,則依照優(yōu)先權最高的ID選擇符為黃色文字。
      
    7. 注釋:/* ... */
      你可以在CSS中插入注釋來說明你代碼的意思,注釋有利于你或別人以后編輯和更改代碼時理解代碼的含義。在瀏覽器中,注釋是不顯示的。CSS注釋以"/*" 開頭,以"*/" 結尾,如下:
      /* 定義段落樣式表 */
      p
      {
      text-align: center; /* 文本居中排列 */
      color: black; /* 文字為黑色 */
      font-family: arial /* 字體為arial */
      }



    css可以用任何寫文本的工具進行開發(fā),如文本工具,dreamweaver開發(fā)
    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技術,可以有效地對頁面的布局、字體、顏色、背景和其它效果實現(xiàn)更加精確的控制。

    只要對相應的代碼做一些簡單的修改,就可以改變同一頁面的不同部分,或者頁數不同的網頁的外觀和格式。

    它的作用可以達到:

    (1)在幾乎所有的瀏覽器上都可以使用。

    (2)以前一些非得通過圖片轉換實現(xiàn)的功能,現(xiàn)在只要用CSS就可以輕松實現(xiàn),從而更快地下載頁面。

    (3)使頁面的字體變得更漂亮,更容易編排,使頁面真正賞心悅目。

    (4)你可以輕松地控制頁面的布局 。

    (5)你可以將許多網頁的風格格式同時更新,不用再一頁一頁地更新了。你可以將站點上所有的網頁風格都使用一個CSS文件進行控制,只要修改這個CSS文件中相應的行,那么整個站點的所有頁面都會隨之發(fā)生變動。

    想一想,沒有使用CSS前我們是如何控制字體的顏色和大小以及所使用的字體的?我們一般使用HTML標簽來實現(xiàn),代碼非常煩瑣。

    很難想象,如果在一個頁面里需要頻繁地更替字體的顏色大小,最終生成的HTML代碼的長度一定臃腫不堪。

    說實話,CSS就是為了簡化這樣的工作誕生的,當然其功能決非這么簡單。

    CSS是通過對頁面結構的風格控制的思想,控制整個頁面的風格的。

    式樣單放在頁面中,通過瀏覽器的解釋執(zhí)行,是完全的文本,任何懂得HTML的人都可以掌握,非常的容易。甚至對一些非常老的瀏覽器,也不會產生頁面混亂的現(xiàn)象。

    CSS的一大優(yōu)點是它的圖片傳輸速度比較完全的HTML網頁要快一點。

    CSS:
    Chinese,Surface-to-Surface
    中國面對面導彈 簡稱CSS-N
    CSS具有兩面性。就像它在格式化文本、導航欄、圖片以及其他小小的網頁方面很棒一樣,當你準備好布局完整的網頁時,它真正可怕的一面也展現(xiàn)出來了。
    CSS布局有兩種風格——絕對定位和浮動。絕對定位讓你把一個元素以像素級的精確性定位在網頁的任何位置——或者理論上是這樣。這種整體控制令人興奮,就如你將在下一章中所看到的,但是實際上很難實現(xiàn)。這就是大量網頁使用基于浮動的布局的原因,也是本章的主題。
    CSS布局如何進行
    How CSS Layout Works
    如在第1章中討論過的,HTML的局限性迫使設計師們去開發(fā)更聰明的方式來使他們的網頁更美觀。過去最常用的工具是[table]標簽,它本是用來創(chuàng)建電子數據表——比如由數據行和列組成的信息顯示表。但是設計師們卻用HTML的表格來創(chuàng)建一種用來組織網頁內容的腳手架(見圖11-1)。可是由于[table]標簽本來不是要用于布局的,因此設計師們不得不經常以各種不尋常的方式來使用這個標簽——比如把一個表格放在另一個表格的單元里面——僅僅為了得到他們想要的效果。這種方法的工作量很大,增加了大量額外的HTML代碼,并使得后面要修改設計很難。但是在CSS出現(xiàn)之前,那就是網頁設計師們所擁有的一切辦法。
    如果你已經習慣于使用[table]標簽,那么當你開始使用CSS進行布局時,必須發(fā)展一種新的思維。首先,忘掉行和列(運用表格時的一種重要的觀念)。沒有
    列跨度、行跨度和格子狀的表格結構在CSS中是找不到的。然而,你可以把一個標簽當成一個表格單元。有了表格單元,標簽就是把你要的內容定位在網頁區(qū)域的一個邏輯位置。此外,如你所見,CSS設計經常把一個div嵌套在另一個div里面,就像你把表格嵌套在表格里面來獲得特定的效果一樣——但是,幸運的是,CSS方法只用少得多的HTML代碼。
    強大的標簽
    The Mighty   Tag
    無論使用表格還是CSS,網頁布局都是把大塊的內容放進網頁的不同區(qū)域里面。有了CSS,最常用來組織內容的元素就是標簽。如第18頁所述,標簽是沒有固有格式化屬性的一個HTML元素(除了瀏覽器把這個標簽當成前后有換行的塊之外);反之,它被用來標識元素的一個邏輯組合或者網頁中的一個分區(qū)。
    你將代表性地把一大塊屬于一起的HTML包圍在一個里面。圖11-1中包含logo和導航欄的元素占據了網頁頂部,因此用一個標簽把它們包圍起來很有意義。至少,你要給網頁的所有主要區(qū)域包含標簽,例如橫幅、主要內容區(qū)域、工具條、頁腳,等等。但是它也可能把一個或者更多的div包在一個里面。一種最常用的方法就是把<body>標簽里面的HTML包在一個里面。然后可以通過把CSS應用到包裝,設置基礎的頁面屬性。你可以給網頁內容設定一個整體的寬度,設置左邊距和右邊距,或者把所有網頁內容在屏幕的中間居中。(在第313頁的教程中,你有機會用到一個包裝。)
    一旦已經把標簽放在了適當的位置上,再給每個標簽添加一個類或者ID,變成你分別對每個定義樣式的句柄。對于只出現(xiàn)一次和形成網頁的基本構建塊的網頁部位,設計師們通常使用一個ID。一個網頁橫幅區(qū)域的標
    簽看起來可能像這樣:。你可以對一個ID每頁只使用一次,因此當有一個多次顯示的元素時,就用一個類代替。如果你有幾個定位照片和照片說明的div時,可以創(chuàng)建一個樣式像這樣:。
    有了類似這些的樣式,就可以定位各種各樣的網頁元素了。利用CSS的float屬性,你可以定位不同的內容塊給一張網頁的左邊或者右邊(或者一個包含塊比如另一個的左邊或者右邊)。
    至理名言
    更多并非更好
    雖然div對于CSS布局很重要,但也別對你的網頁濫用div。一個常見的陷阱是相信你必須把一張網頁中的一切都包圍在一個標簽里面。假設你的主導航欄是一個鏈接的無序列表
    (就像第218頁中所述)。由于它是一個重要的元素,你可能會試探用一個來把它圍起來:<ul>...</ul>
    。但是當<ul>標簽唾手可得時,就沒有必要去添加一個了。只要<ul>包含主要的導航欄鏈接,就只需添加ID樣式給這個標簽:<ul id= "mainNav">。多余的只是一些沒有必要的代碼。

    posted @ 2008-06-30 11:22 sunny spring 閱讀(351) | 評論 (0)編輯 收藏

    jspSmartUpload上傳下載全攻略

    一、安裝篇

      jspSmartUpload是由www.jspsmart.com網站開發(fā)的一個可免費使用的全功能的文件上傳下載組件,適于嵌入執(zhí)行上傳下載操作的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.進入命令行狀態(tài),將目錄切換到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表明以操作系統(tǒng)的根目錄為文件根目錄另存文件,SAVEAS_VIRTUAL表明以Web應用程序的根目錄為文件根目錄另存文件,SAVEAS_AUTO則表示讓組件決定,當Web應用程序的根目錄存在另存文件的目錄時,它會選擇SAVEAS_VIRTUAL,否則會選擇SAVEAS_PHYSICAL。

    例如,saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)執(zhí)行后若Web服務器安裝在C盤,則另存的文件名實際是c:uploadsample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)執(zhí)行后若Web應用程序的根目錄是webapps/jspsmartupload,則另存的文件名實際是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)執(zhí)行時若Web應用程序根目錄下存在upload目錄,則其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL),否則同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)。

    建議:對于Web程序的開發(fā)來說,最好使用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

    作用:取文件長度(以字節(jié)計)

    原型:public int getSize()

    8、getBinaryData

    作用:取文件數據中指定位移處的一個字節(jié),用于檢測文件等處理。

    原型: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,注意區(qū)分)。

    原型: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。

    作用:執(zhí)行上傳下載的初始化工作,必須第一個執(zhí)行。

    原型:有多個,主要使用下面這個:

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

    其中,pageContext為JSP頁面內置對象(頁面上下文)。

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

    1、upload

    作用:上傳文件數據。對于上傳操作,第一步執(zhí)行initialize方法,第二步就要執(zhí)行這個方法。

    原型: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。(同F(xiàn)ile類的saveAs方法的選項之值類似)SAVE_PHYSICAL指示組件將文件保存到以操作系統(tǒng)根目錄為文件根目錄的目錄下,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瀏覽器一般根據下載的文件擴展名決定執(zhí)行什么操作,擴展名為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

    本頁面提供表單,讓用戶選擇要上傳的文件,點擊"上傳"按鈕執(zhí)行上傳操作。

    頁面源碼如下:

    <!--
                文件名: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

    本頁面執(zhí)行文件上傳操作。頁面源碼中詳細介紹了上傳方法的用法,在此不贅述了。

    頁面源碼如下:

    <%--
                文件名: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);
                // 若文件不存在則繼續(xù)
                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);
                // 另存到操作系統(tǒng)的根目錄為文件根目錄的目錄下
                // 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");
                %>


    注意,執(zhí)行下載的頁面,在Java腳本范圍外(即<% ... %>之外),不要包含HTML代碼、空格、回車或換行等字符,有的話將不能正確下載。不信的話,可以在上述源碼中%><%之間加入一個換行符,再下載一下,保證出錯。因為它影響了返回給瀏覽器的數據流,導致解析出錯。

    3、如何下載中文文件

    jspSmartUpload雖然能下載文件,但對中文支持不足。若下載的文件名中有漢字,則瀏覽器在提示另存的文件名時,顯示的是一堆亂碼,很掃人興。上面的例子就是這樣。(這個問題也是眾多下載組件所存在的問題,很少有人解決,搜索不到相關資料,可嘆!)

    為了給jspSmartUpload組件增加下載中文文件的支持,我對該組件進行了研究,發(fā)現(xiàn)對返回給瀏覽器的另存文件名進行UTF-8編碼后,瀏覽器便能正確顯示中文名字了。這是一個令人高興的發(fā)現(xiàn)。于是我對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組件對返回的文件未作任何處理,現(xiàn)在做了編碼的轉換工作,將文件名轉換為UTF-8形式的編碼形式。UTF-8編碼對英文未作任何處理,對中文則需要轉換為%XX的形式。toUtf8String方法中,直接利用Java語言提供的編碼轉換方法獲得漢字字符的UTF-8編碼,之后將其轉換為%XX的形式。

    將源碼編譯后打包成jspSmartUpload.jar,拷貝到Tomcat的shared/lib目錄下(可為所有WEB應用程序所共享),然后重啟Tomcat服務器就可以正常下載含有中文名字的文件了。另,toUtf8String方法也可用于轉換含有中文的超級鏈接,以保證鏈接的有效,因為有的WEB服務器不支持中文鏈接。

    小結:jspSmartUpload組件是應用JSP進行B/S程序開發(fā)過程中經常使用的上傳下載組件,它使用簡單,方便。現(xiàn)在我又為其加上了下載中文名字的文件的支持,真?zhèn)€是如虎添翼,必將贏得更多開發(fā)者的青睞。

    posted @ 2008-06-30 11:21 sunny spring 閱讀(313) | 評論 (0)編輯 收藏

    JavaScript

    1. 狀態(tài)欄 (statusbar)顯功能
    2. 日期物件
    3. 隨數的產生
    4. 開啟新窗囗

    范 例 5:

    在 這 一 部 分 首 先 要 為 你 展 示 的 JavaScript 特 性 是 將 你 的 滑 鼠 移 到 這 個 不 同 顏 色

    連 結上 面, 此 時 看 看 瀏 覽 器 下 的 狀 態(tài) 列 有 何 結 果。 然 後 這 樣 的 功 能 我 們 可 以

    與 JavaScript 的 功 能 相 結 合。 好, 現(xiàn) 在 再 將 你 的 滑 鼠 移 到 本 處 不 同 顏 色 的連 結

    面, 你 應 該 會 發(fā) 現(xiàn) 有 一 個 視 窗 出 現(xiàn), 是 吧?! 如 何! 怎 麼 做 到 的 呢? 以 下 就 是

    這 一 個 連 結 的 作 法:

    <a href="tpage.htm" onMouseOver="window.status='Just another stupid link...'; return true">
    在 這 兒 你 只 要 在 傳 統(tǒng) <a> 的 標 簽 中 加 入 onMouseOver 的 method, 就 可 達 成 你 要 的

    效 果 了。 這 里 的 window.status 是 用 來 讓 你 可 以 在 WWW 瀏 覽 器 的 狀 態(tài) 列 上 顯 示

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

    起 來, 在 訊 息 部 分 結 束 之 後, 必 須 加 上 ; return true

    好 了, 利 用 以 上 的 特 性 可 以 很 簡 單 的 完 成 第 二 個 連 結 的 例 子! 相 當 簡 單, 以

    onMouseOver 的 method 然 後 配 合 事 件 發(fā) 生 時 去 呼 叫 函 數 hello() 就 行 了, 不 再

    多 加 解 釋 了, 作 法 如 下:

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


    范 例 6:

    接 下 來 我 們 要 告 訴 你 一 個 使 用 日 期 和 時 間 的 例 子。 在 第 一 部 分 中, 你 已 看 過 了

    lastModified 的 用 法 和 作 法。 現(xiàn) 在 要 告 訴 你 的 并 非 是 印 出 網 路 上 伺 服 器 或 文 件

    修 改 日 期, 而 是 你 個 人 客 戶 端 機 器 的 日 期 和 時 間。 以 下 就 是 執(zhí) 行 結 果:

    現(xiàn) 在 時 間 是: 14:4
    今 天 日 期 為: 6/3/2008

    做 法 如 下:

    <script language="LiveScript">
    <!-- Hiding
    today = new Date()
    document.write("現(xiàn) 在 時 間 是: ",today.getHours(),":",today.getMinutes())
    document.write("<br>今 天 日 期 為: ", today.getMonth()+1,"/",today.getDate(),"/",today.getYear());
    // end hiding contents -->
    </script>
    在 本 例 中, 我 們 必 需 首 先 建 立 一 個 日 期 變 數, 這 可 以 由 today= new Date()來 完 成。

    如 果 沒 有 特 別 指 定 時 間 與 日 期 的 話, 瀏 覽 器 將 會 采 用 本 地 客 戶 端 機 器 的 時 間, 若 將

    它 放 入 變 數 today 中。 這 兒 要 注 意 的 是: 我 們 并 沒 有 宣 告 today 這 個 變 數 的 型 態(tài),

    這 和 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 并 沒 有 實 際 的 日 期 型 態(tài), 但 是 它 卻 能 毫 不 費 力 地 顯 示 出 日 期 和 時 間,

    原 因 是 它 是 從 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>

    我 們 的 做 法 是 以 上 一 個 范 例 中 的 時 間 函 數; 它 會 出 現(xiàn) 一 個 很 大 的 數,

    利 用 這 個 數 再 加 以 運 算 即 可! 例 如: 將 它 拿 來 做 正 弦 函 數(sin) 的 運

    算, 得 到 的 數 再 做 絕 對 值 的 運 算, 結 果 可 以 得 到 一 個 介 於 0 與 1 間 的

    實 數。 因 為 時 間 的 改 變 是 ms 為 單 位, 而 且 你 絕 不 會 獲 得 相 同 的 數 字。

    不 過 這 個 做 法 并 不 適 合 拿 來 快 速 的 連 續(xù) 產 生 一 系 列 的 亂 數, 但 如 果 你

    是 不 定 時, 久 久 的 用 一 次, 那 效 果 就 不 錯 了!


    范 例 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 位 置。 如 果 留 者 空 白 的 話, 那 就 會 呈 現(xiàn) 一 個 空 白 視 窗, 并 可 以

    透 過 JavaScript 寫 入 東 西! 下 一 對 雙 引 號 內 的 內 容 是 這 個 新 開 啟 視 窗 的 名 字,

    你 可 以 喜 歡 給 它 任 意 一 個 名 字, 但 不 可 加 入 空 白, 如 用 Display Window 的 話 便

    會 出 現(xiàn) 錯 誤 訊 息, 請 注 意。 接 下 來 的 一 連 串 雙 引 號 內 所 指 定 的 是 該 視 窗

    的 相 關 性 質(properties), 這 些 蠻 有 趣 的, 你 可 以 指 定 要 不 要 有 工 具 棒(toolbar) 、

    卷 軸(scrollbar), 等 等, 例 如: 如 果 你 寫 toolbar = yes, 那 就 會 在 你 所 產 生 出

    來 的 視 窗 中 出 現(xiàn) 一 排 工 具 列。 以 下 有 許 多 你 可 以 改 變 的 視 窗 特 性, 請 注 意 它 們

    字 中 間 不 可 以 有 空 白:

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

    以 上 的 pixels 部 分, 你 可 以 填 入 點 數 的 數 值, 這 數 值 是 告 訴 瀏 覽 器 這 個 視 窗 的

    大 小。 在 開 啟 視 窗, 并 且 將 它 稱 為 msg 以 後, 就 可 以 開 始 寫 些 東 西 到 視 窗 中 了。

    你 可 以 寫 入 一 般 正 規(guī) 的 HTML 語 法 文 字。 哇! 這 可 不 得 了 了, 也 就 是 說, 你 可 以

    利 用 先 前 使 用 者 在 form 表 格 中 輸 入 給 你 的 文 章 直 接 將 它 回 應 至 瀏 覽 器 上 來 了! 這 些

    功 能 在 幾 個 月 前 大 概 還 只 能 用 CGI 才 能 達 到 喔! 現(xiàn) 在 你 不 用 CGI 也 可 以 做 了!


    1. 什麼是JavaScript?
    2. 執(zhí)行 JavaScript scripts
    3. 將scripts 語法嵌入HTML文件之中
    4. 第一個函數
    5. 輸入型元件
    6. 日期功能 -- 最後修改期

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

    透過 JavaScript 可以做到回應使用者的需求事件 (如: form 的輸入) 而不用任何的網路

    來回傳輸資料,所以當一位使用者輸入一項資料時,它不用經過傳給伺服端 (server)

    處理,再傳回來的過程,而直接可以被客戶端 (client) 的應用程式所處理。你也可

    以想像成有一個可執(zhí)行程式在你的客端上執(zhí)行一樣!目前已有一些寫好的程式在

    Internet 上你可以連過去看看,以下有一些計算器的例子,在 Nescape 上。


    JavaScript 和 Java 很類似,但到底并不一樣! Java 是一種比 JavaScript 更復雜

    許多的程式語言,而 JavaScript 則是相當容易了解的語言。JavaScript 創(chuàng)作者

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

    如需相關的更多資訊,可以去讀讀 Netscape 的有關 Netscape JavaScript 之介紹。


     

    如何執(zhí)行 JaveScript? 范例 1:

    JavaScript 如何執(zhí)行呢?

    Netscape 2.0 beta 3 版以上,就可以執(zhí)行 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 中,將會產生一個按鈕,當你用滑鼠去按它的時候,應該會出現(xiàn)

    一個視窗上面有“嗨! 你好”的字串,如何?不錯吧!這個結果是如何產生

    的呢?首先,在 <head>內的函數會被載入并存於內存中,接著一個新

    的 <form>標簽 <input type ="button".....>將產生一個接鈕。然後,你可以

    在後面看到 'onClick' 的指令,這就是告訴瀏覽器,當該按鈕被按時,應會執(zhí)行

    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>
    
    

    現(xiàn)在你可以試試結果如何:

    請輸入你的名字:

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

    的 WWW 瀏覽器因為不認識這些函數而產生錯誤。它的順序應 該為 <script>

    先,接著為注解的開頭 <!-,然後是內容,注解尾 ->, 最後是 </script>。

    另外要注意的一點是,語解尾那一行的開頭雙斜線 "http://" ,不可以省略,它代表了

    JavaScript 的注解,若省略了的話, ->之前的字會被誤認為是 JavaScript 的指令。


    這個例子可以讓使用者輸入一段文字,然後再輸入完畢後經由 <input>標簽中的

    "onBlur" 事件函數偵知,於是呼叫 Getname(Str)這個函數來加以取得輸入字串,

    并將它顯示在對話視窗上!函數 Getname(this.value) 中的 "this.value" 是你在文

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


     



    范例 4:

    這個范例更是帥了!我們在 HTML 文件檔完成了以後,常會加上一行文件

    最後修改的日期,現(xiàn)在你可不用擔心每次都要去改或是忘了改了。你可以

    很簡單的寫一個如下的描述語法程式,就可以自動的為你每次產生最後修

    改的日期了:

    <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 本身是會區(qū)分大小寫的, lastmodifiedlastModified

    在它看來是不同的結果。

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

    機器都是一樣的,例如:PC 上跑得很正確的,在工作站上不一定會有相同的

    結果,所以,或許你仍得測一測不同機器的結果才會有所定論。當然,這一切

    是因為 JavaScript 還正在發(fā)展的原因,最新的訊息還是得去拜訪一下Netscape

    公司才知道。也許你也不用奇怪,當你隔周再來訪時,JavaScript 可能又作了

    相當大的改變了呢

    在這個例子中又有新的東西了。首先,讓我們注意一下,在語法中的注解部分

    posted @ 2008-06-30 11:20 sunny spring 閱讀(301) | 評論 (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="#">之后的文字都會以所設的對齊方式顯示, 直到出現(xiàn)另一個<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=區(qū)域座標列表 href="連結點之URL">
    <area shape=形狀 coords=區(qū)域座標列表 href="連結點之URL">
    <area shape=形狀 coords=區(qū)域座標列表 href="連結點之URL">
    <area shape=形狀 coords=區(qū)域座標列表 href="連結點之URL"> </map>
    【1】定義形狀 -- shape
    shape=rect:矩形 shape=circle:圓形 shape=poly:多邊形
    【2】定義區(qū)域 -- 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>
    四、多列輸入文字區(qū)表單 <form action="URL" method="post"> <textarea> .......... .......... </textarea> </form>
    【1】文字區(qū)的變數名稱 -- name <textarea name=變數名稱>
    【2】設定文字輸入區(qū)寬度 -- cols <textarea cols=字元數>
    【3】設定文字輸入區(qū)高度 -- rows <textarea rows=列數>
    【4】輸入區(qū)設定預設字串 <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:固定出現(xiàn)卷軸
    no:不出現(xiàn)卷軸 auto:自動判斷文件大小需不需要卷軸(預設值)
    【6】鎖住分割視窗的大小 -- noresize <frame noresize>

    posted @ 2008-06-30 11:16 sunny spring 閱讀(452) | 評論 (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                  // 分離文件信息 獲得最終想要的字節(jié)
    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 閱讀(5295) | 評論 (1)編輯 收藏

    僅列出標題  下一頁
    主站蜘蛛池模板: 24小时日本电影免费看| 久久亚洲AV成人无码国产| 又大又硬又爽又粗又快的视频免费| 成年丰满熟妇午夜免费视频| 久久狠狠躁免费观看| 丁香六月婷婷精品免费观看| 亚洲精品久久无码av片俺去也| 成年女人午夜毛片免费看| a级成人毛片免费视频高清| 国产亚洲视频在线播放大全| 亚洲av永久无码精品天堂久久| 国产成人在线观看免费网站| 国产精品久久久久久久久免费| 亚洲国产精品无码久久| 亚洲欧洲日本精品| 亚洲∧v久久久无码精品| 免费一级黄色毛片| 国产美女无遮挡免费视频网站| 中文成人久久久久影院免费观看| 亚洲一区二区三区日本久久九| 美女网站免费福利视频| a毛片在线看片免费| 中文字幕乱码系列免费| 毛片基地看看成人免费| 久久久久国色AV免费观看| 精品国产污污免费网站入口在线| 亚洲制服丝袜在线播放| 亚洲综合久久成人69| 久久亚洲AV成人无码软件| 亚洲天堂中文资源| 亚洲午夜精品久久久久久人妖| 免费无码黄动漫在线观看| 天天摸天天碰成人免费视频| 大地资源免费更新在线播放| 99久久久国产精品免费无卡顿| 噜噜噜亚洲色成人网站| 疯狂做受xxxx高潮视频免费| 日日狠狠久久偷偷色综合免费 | 亚洲成AV人片在线观看无| 亚洲精品无码久久一线| 91精品国产亚洲爽啪在线观看|