<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)計(jì)

    develop

    news

    最新評(píng)論

    2008年12月17日 #

    JDBC連接數(shù)據(jù)庫大全

              現(xiàn)在有好多初學(xué)jsp的網(wǎng)友經(jīng)常會(huì)問數(shù)據(jù)庫怎么連接啊,怎么老出錯(cuò)啊?所以我集中的在這寫篇文章供大家參考,其實(shí)這種把數(shù)據(jù)庫邏輯全部放在jsp里未必是好的做法,但是有利于初學(xué)者學(xué)習(xí),所以我就這樣做了,當(dāng)大家學(xué)到一定程度的時(shí)候,可以考慮用MVC的模式開發(fā)。在練習(xí)這些代碼的時(shí)候,你一定將jdbc的驅(qū)動(dòng)程序放到服務(wù)器的類路徑里,然后要在數(shù)據(jù)庫里建一個(gè)表test,有兩個(gè)字段比如為test1test2,可以用下面SQL
    create table test(test1 varchar(20),test2 varchar(20)
    然后向這個(gè)表寫入一條測(cè)試紀(jì)錄
    那么現(xiàn)在開始我們的jsp和數(shù)據(jù)庫之旅吧。
    一、jsp連接Oracle8/8i/9i數(shù)據(jù)庫(用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
    為你的數(shù)據(jù)庫的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()) {%>
    您的第一個(gè)字段內(nèi)容為:<%=rs.getString(1)%>
    您的第二個(gè)字段內(nèi)容為:<%=rs.getString(2)%>
    <%}%>
    <%out.print("
    數(shù)據(jù)庫操作成功,恭喜你");%>
    <%rs.close();
    stmt.close();
    conn.close();
    %>
    </body>
    </html>
    二、jsp連接Sql Server7.0/2000數(shù)據(jù)庫
    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
    為你的數(shù)據(jù)庫的
    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()) {%>
    您的第一個(gè)字段內(nèi)容為:<%=rs.getString(1)%>
    您的第二個(gè)字段內(nèi)容為:<%=rs.getString(2)%>
    <%}%>
    <%out.print("
    數(shù)據(jù)庫操作成功,恭喜你");%>
    <%rs.close();
    stmt.close();
    conn.close();
    %>
    </body>
    </html>
    三、jsp連接DB2數(shù)據(jù)庫
    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
    為你的數(shù)據(jù)庫名
    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()) {%>
    您的第一個(gè)字段內(nèi)容為:<%=rs.getString(1)%>
    您的第二個(gè)字段內(nèi)容為:<%=rs.getString(2)%>
    <%}%>
    <%out.print("
    數(shù)據(jù)庫操作成功,恭喜你");%>
    <%rs.close();
    stmt.close();
    conn.close();
    %>
    </body>
    </html>
    四、jsp連接Informix數(shù)據(jù)庫
    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
    為你的數(shù)據(jù)庫名
    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()) {%>
    您的第一個(gè)字段內(nèi)容為:<%=rs.getString(1)%>
    您的第二個(gè)字段內(nèi)容為:<%=rs.getString(2)%>
    <%}%>
    <%out.print("
    數(shù)據(jù)庫操作成功,恭喜你");%>
    <%rs.close();
    stmt.close();
    conn.close();
    %>
    </body>
    </html>
    五、jsp連接Sybase數(shù)據(jù)庫
    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
    為你的數(shù)據(jù)庫名
    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()) {%>
    您的第一個(gè)字段內(nèi)容為:<%=rs.getString(1)%>
    您的第二個(gè)字段內(nèi)容為:<%=rs.getString(2)%>
    <%}%>
    <%out.print("
    數(shù)據(jù)庫操作成功,恭喜你");%>
    <%rs.close();
    stmt.close();
    conn.close();
    %>
    </body>
    </html>
    六、jsp連接MySQL數(shù)據(jù)庫
    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
    為你的數(shù)據(jù)庫名
    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()) {%>
    您的第一個(gè)字段內(nèi)容為:<%=rs.getString(1)%>
    您的第二個(gè)字段內(nèi)容為:<%=rs.getString(2)%>
    <%}%>
    <%out.print("
    數(shù)據(jù)庫操作成功,恭喜你");%>
    <%rs.close();
    stmt.close();
    conn.close();
    %>
    </body>
    </html>
    七、jsp連接PostgreSQL數(shù)據(jù)庫
    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
    為你的數(shù)據(jù)庫名
    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()) {%>
    您的第一個(gè)字段內(nèi)容為:<%=rs.getString(1)%>
    您的第二個(gè)字段內(nèi)容為:<%=rs.getString(2)%>
    <%}%>
    <%out.print("
    數(shù)據(jù)庫操作成功,恭喜你");%>
    <%rs.close();
    stmt.close();
    conn.close();
    %>
    </body>
    </html>

    posted @ 2008-12-17 16:47 sunny spring 閱讀(312) | 評(píng)論 (0)編輯 收藏

    2008年12月2日 #

    Hibernate入門程序

           以下程序是Hiberante入門程序:代碼如下:首先說hibernate開發(fā)流程.A、準(zhǔn)備一個(gè)POJO類  B、創(chuàng)建類的映射和配置文件(hibernate.cfg.xml  class.hbm.xml)class.hbm.xml此配置文件是必須與POJO類中的屬性一一對(duì)應(yīng).
    現(xiàn)在我以我創(chuàng)建的程序?yàn)槔齺磉M(jìn)行說明:數(shù)據(jù)庫為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位置一致.也就是說必須放在同一個(gè)目錄.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)建應(yīng)用程序并進(jìn)行代碼測(cè)試:

    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();
      // 事務(wù)提交
      try{
       Transaction tx = session.beginTransaction();
       // 創(chuàng)建對(duì)象
       Admin hb = new Admin();
       hb.setId(3);
       hb.setUsername("Hibernate3.2");
       hb.setPassword("20081202");
       //hb.setUsername("WCH");
       //hb.setPassword("Hibernate");
       // 執(zhí)行插入語句,在hibernat中操作的是一個(gè)對(duì)象
       session.save(hb);
       // 提交事務(wù)
       tx.commit();
      }catch(Exception e)
      {
       System.out.println("error Msg:"+e.getMessage());
      }finally{
        // close session
        session.close();
      }
     }
    }

    更為詳細(xì)的解釋請(qǐng)參照Hibernate官方網(wǎng)站:www.hibernate.org


    posted @ 2008-12-02 10:19 sunny spring 閱讀(279) | 評(píng)論 (0)編輯 收藏

    2008年12月1日 #

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

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

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

    2008年11月21日 #

    quartz 詳解

             最近在開發(fā)的過程中,經(jīng)常要使用系統(tǒng)自動(dòng)清零的操作,比如說:系統(tǒng)在給定的時(shí)間跟客戶發(fā)送電子郵件,在指定的時(shí)間段內(nèi)執(zhí)行某些操作等等,如果我們只是人工去操作的話不但步驟非常的麻煩而且覺得這是一個(gè)工作量非常大的任務(wù),有了quartz框架以后我們所有的任務(wù)多可以交給它去做,程序員唯一要做的只是編寫代碼并配置一下程序就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表示間斷啟動(dòng)時(shí)間  ?表示執(zhí)行間隔時(shí)間  13啟動(dòng)時(shí)間-->
                      <cron-expression>0 1/2 23 * * ?</cron-expression>
                      <!--每月1號(hào)0點(diǎn)執(zhí)行
                       <cron-expression>0 1 0 1 1-12 ?</cron-expression>
                       -->
                  </cron>
            </trigger>
    </job>
    3、編寫java代碼進(jìn)行測(cè)試:
    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);

    }
    }
    出下以下結(jié)果表示配置成功:
    test
    4、此步驟是最后一步也是最重要的一步,只要加入如下代碼的到/WEB-INF/web.xml文件中在指定的時(shí)間內(nèi)就會(huì)執(zhí)行系統(tǒng)調(diào)度.
    <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>

    參考網(wǎng)站:http://www.iocblog.net/project/quartz.html

    posted @ 2008-11-21 14:38 sunny spring 閱讀(4511) | 評(píng)論 (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)
    以上錯(cuò)誤是因?yàn)閟truts-config.xml文件中<form-beans>中form的路徑不正確所致.

    posted @ 2008-11-19 16:28 sunny spring 閱讀(246) | 評(píng)論 (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 大學(xué)獎(jiǎng)學(xué)金處



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

    感性體驗(yàn)CSS


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

    這還不是全部,不改動(dòng)HTML,只是通過添加不同的CSS規(guī)則,我們就可以得到各種不同樣式的網(wǎng)頁:
    http://www.csszengarden.com/?cssfile=/208/208.css&page=0
    好了,下面我們?cè)賮砘卮鹗裁词荂SS這個(gè)問題。

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

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

    鏈入外部樣式表文件 (Linking to a Style Sheet)
    你可以先建立外部樣式表文件(.css),然后使用HTML的link對(duì)象。示例如下:
    <head>
    <title>文檔標(biāo)題</title>
    <link rel=stylesheet type="text/css">
    </head>
    而在XML中,你應(yīng)該如下例所示在聲明區(qū)中加入:
    <? xml-stylesheet type="text/css" ?>

    定義內(nèi)部樣式塊對(duì)象 (Embedding a Style Block)
    你可以在你的HTML文檔的<HTML>和<BODY>標(biāo)記之間插入一個(gè)<STYLE>...</STYLE>塊對(duì)象。 定義方式請(qǐng)參閱樣式表語法。示例如下:
    <html>
    <head>
    <title>文檔標(biāo)題</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>
    請(qǐng)注意,這里將style對(duì)象的type屬性設(shè)置為"text/css",是允許不支持這類型的瀏覽器忽略樣式表單。

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


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

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

    網(wǎng)頁設(shè)計(jì)中常用的CSS屬性

    文字或元素的顏色 color
    背景顏色 background-color
    背景圖像 background-image
    字體 font-family
    文字大小 font-size
    列表樣式 list
    鼠標(biāo)樣式 cursor
    邊框樣式 border
    內(nèi)補(bǔ)白 padding
    外邊距 margin
    等...


    CSS的語法:
      CSS的定義是由三個(gè)部分構(gòu)成:
      選擇符(selector),屬性(properties)和屬性的取值(value)。
      語法: selector {property: value} (選擇符 {屬性:值})
      說明:
      ·選擇符是可以是多種形式,一般是你要定義樣式的HTML標(biāo)記,例如BODY、P、TABLE……,你可以通過此方法定義它的屬性和值,屬性和值要用冒號(hào)隔開:
      例子:body {color: black},此例的效果是使頁面中的文字為黑色。
      ·如果屬性的值是多個(gè)單詞組成,必須在值上加引號(hào),比如字體的名稱經(jīng)常是幾個(gè)單詞的組合:
      例子:p {font-family: "sans serif"} (定義段落字體為sans serif)
      · 如果需要對(duì)一個(gè)選擇符指定多個(gè)屬性時(shí),我們使用分號(hào)將所有的屬性和值分開:
      例子:p {text-align: center; color: red} (段落居中排列;并且段落中的文字為紅色)
      2. 選擇符組
      你可以把相同屬性和值的選擇符組合起來書寫,用逗號(hào)將選擇符分開,這樣可以減少樣式重復(fù)定義:
      h1, h2, h3, h4, h5, h6 { color: green } (這個(gè)組里包括所有的標(biāo)題元素,每個(gè)標(biāo)題元素的文字都為綠色)
      p, table{ font-size: 9pt } (段落和表格里的文字尺寸為9號(hào)字)
      效果完全等效于:
      p { font-size: 9pt }
      table { font-size: 9pt }
      3. 類選擇符
      用類選擇符你能夠把相同的元素分類定義不同的樣式,定義類選擇符時(shí),在自定類的名稱前面加一個(gè)點(diǎn)號(hào)。假如你想要兩個(gè)不同的段落,一個(gè)段落向右對(duì)齊,一個(gè)段落居中,你可以先定義兩個(gè)類:
      p.right {text-align: right}
      p.center {text-align: center}
      然后用不在不同的段落里,只要在HTML標(biāo)記里加入你定義的class參數(shù):
      這個(gè)段落向右對(duì)齊的
      這個(gè)段落是居中排列的
      類選擇符還有一種用法,在選擇符中省略HTML標(biāo)記名,這樣可以把幾個(gè)不同的元素定義成相同的樣式:
      .center {text-align: center} (定義.center的類選擇符為文字居中排列)
      這樣的類可以被應(yīng)用到任何元素上。下面我們使h1元素(標(biāo)題1)和p元素(段落)都?xì)w為“center”類,這使兩個(gè)元素的樣式都跟隨“.center”這個(gè)類選擇符:
      <h1 class="center">這個(gè)標(biāo)題是居中排列的</h1>
      這個(gè)段落也是居中排列的

      注意:這種省略HTML標(biāo)記的類選擇符是我們經(jīng)后最常用的CSS方法,使用這種方法,我們可以很方便的在任意元素上套用預(yù)先定義好的類樣式。
      4. ID選擇符
      在HTML頁面中ID參數(shù)指定了某個(gè)單一元素,ID選擇符是用來對(duì)這個(gè)單一元素定義單獨(dú)的樣式。
      ID選擇符的應(yīng)用和類選擇符類似,只要把CLASS換成ID即可。將上例中類用ID替代:
      這個(gè)段落向右對(duì)齊
      定義ID選擇符要在ID名稱前加上一個(gè)“#”號(hào)。和類選擇符相同,定義ID選擇符的屬性也有兩種方法。下面這個(gè)例子,ID屬性將匹配所有id="intro"的元素:
      #intro
      {
      font-size:110%;
      font-weight:bold;
      color:#0000ff;
      background-color:transparent
      } (字體尺寸為默認(rèn)尺寸的110%;粗體;藍(lán)色;背景顏色透明)
      下面這個(gè)例子,ID屬性只匹配id="intro"的段落元素:
      p#intro
      {
      font-size:110%;
      font-weight:bold;
      color:#0000ff;
      background-color:transparent
      }
      注意:ID選擇符局限性很大,只能單獨(dú)定義某個(gè)元素的樣式,一般只在特殊情況下使用。
      5. 包含選擇符
      可以單獨(dú)對(duì)某種元素包含關(guān)系定義的樣式表,元素1里包含元素2,這種方式只對(duì)在元素1里的元素2定義,對(duì)單獨(dú)的元素1或元素2無定義,例如:
      table a
      {
      font-size: 12px
      }
      在表格內(nèi)的鏈接改變了樣式,文字大小為12象素,而表格外的鏈接的文字仍為默認(rèn)大小。
      6. 樣式表的層疊性
      層疊性就是繼承性,樣式表的繼承規(guī)則是外部的元素樣式會(huì)保留下來繼承給這個(gè)元素所包含的其他元素。事實(shí)上,所有在元素中嵌套的元素都會(huì)繼承外層元素指定的屬性值,有時(shí)會(huì)把很多層嵌套的樣式疊加在一起,除非另外更改。例如在DIV標(biāo)記中嵌套P標(biāo)記:
      div { color: red; font-size:9pt}
      ……
      這個(gè)段落的文字為紅色9號(hào)字
      (P元素里的內(nèi)容會(huì)繼承DIV定義的屬性)
      注意:有些情況下內(nèi)部選擇符不繼承周圍選擇符的值,但理論上這些都是特殊的。例如,上邊界屬性值是不會(huì)繼承的,直覺上,一個(gè)段落不會(huì)同文檔BODY一樣的上邊界值。
      另外,當(dāng)樣式表繼承遇到?jīng)_突時(shí),總是以最后定義的樣式為準(zhǔn)。如果上例中定義了P的顏色:
      div { color: red; font-size:9pt}
      p {color: blue}
      ……
      這個(gè)段落的文字為藍(lán)色9號(hào)字
      我們可以看到段落里的文字大小為9號(hào)字是繼承div屬性的,而color屬性則依照最后定義的。
      不同的選擇符定義相同的元素時(shí),要考慮到不同的選擇符之間的優(yōu)先級(jí)。ID選擇符,類選擇符和HTML標(biāo)記選擇符,因?yàn)镮D選擇符是最后加上元素上的,所以優(yōu)先級(jí)最高,其次是類選擇符。如果想超越這三者之間的關(guān)系,可以用!important提升樣式表的優(yōu)先權(quán),例如:
      p { color: #FF0000!important }
      .blue { color: #0000FF}
      #id1 { color: #FFFF00}
      我們同時(shí)對(duì)頁面中的一個(gè)段落加上這三種樣式,它最后會(huì)依照被!important申明的HTML標(biāo)記選擇符樣式為紅色文字。如果去掉!important,則依照優(yōu)先權(quán)最高的ID選擇符為黃色文字。
      
    7. 注釋:/* ... */
      你可以在CSS中插入注釋來說明你代碼的意思,注釋有利于你或別人以后編輯和更改代碼時(shí)理解代碼的含義。在瀏覽器中,注釋是不顯示的。CSS注釋以"/*" 開頭,以"*/" 結(jié)尾,如下:
      /* 定義段落樣式表 */
      p
      {
      text-align: center; /* 文本居中排列 */
      color: black; /* 文字為黑色 */
      font-family: arial /* 字體為arial */
      }



    css可以用任何寫文本的工具進(jìn)行開發(fā),如文本工具,dreamweaver開發(fā)
    css也是一種語言,這種語言要和html或者xhtml語言相結(jié)合才起作用,
    css簡(jiǎn)單來說就是用來美化網(wǎng)頁用的,用css語言來控制網(wǎng)頁的外觀
    舉個(gè)例子
    xhtml部分:
    <ul>
    <li>主頁</li>
    <li>留言</li>
    <li>論壇</li>
    </ul>
    此時(shí)在頁面上的表達(dá)形式是一個(gè)豎向列表,這樣不夠美觀,
    可以css來改善這個(gè)列表為一個(gè)橫向?qū)Ш綏l和超鏈接
    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后,這個(gè)列表變成橫向的導(dǎo)航條了,超級(jí)鏈接是淡色背景,灰色字體,沒有下劃線,高度是30像素,寬度是100像素
    當(dāng)我們鼠標(biāo)經(jīng)過這個(gè)超級(jí)鏈接時(shí)候,變成灰色背景,白色字體


    在主頁制作時(shí)采用CSS技術(shù),可以有效地對(duì)頁面的布局、字體、顏色、背景和其它效果實(shí)現(xiàn)更加精確的控制。

    只要對(duì)相應(yīng)的代碼做一些簡(jiǎn)單的修改,就可以改變同一頁面的不同部分,或者頁數(shù)不同的網(wǎng)頁的外觀和格式。

    它的作用可以達(dá)到:

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

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

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

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

    (5)你可以將許多網(wǎng)頁的風(fēng)格格式同時(shí)更新,不用再一頁一頁地更新了。你可以將站點(diǎn)上所有的網(wǎng)頁風(fēng)格都使用一個(gè)CSS文件進(jìn)行控制,只要修改這個(gè)CSS文件中相應(yīng)的行,那么整個(gè)站點(diǎn)的所有頁面都會(huì)隨之發(fā)生變動(dòng)。

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

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

    說實(shí)話,CSS就是為了簡(jiǎn)化這樣的工作誕生的,當(dāng)然其功能決非這么簡(jiǎn)單。

    CSS是通過對(duì)頁面結(jié)構(gòu)的風(fēng)格控制的思想,控制整個(gè)頁面的風(fēng)格的。

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

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

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

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

    jspSmartUpload上傳下載全攻略

    一、安裝篇

      jspSmartUpload是由www.jspsmart.com網(wǎng)站開發(fā)的一個(gè)可免費(fèi)使用的全功能的文件上傳下載組件,適于嵌入執(zhí)行上傳下載操作的JSP文件中。該組件有以下幾個(gè)特點(diǎn):

    1、使用簡(jiǎn)單。在JSP文件中僅僅書寫三五行JAVA代碼就可以搞定文件的上傳或下載,方便。

    2、能全程控制上傳。利用jspSmartUpload組件提供的對(duì)象及其操作方法,可以獲得全部上傳文件的信息(包括文件名,大小,類型,擴(kuò)展名,文件數(shù)據(jù)等),方便存取。

    3、能對(duì)上傳的文件在大小、類型等方面做出限制。如此可以濾掉不符合要求的文件。

    4、下載靈活。僅寫兩行代碼,就能把Web服務(wù)器變成文件服務(wù)器。不管文件在Web服務(wù)器的目錄下或在其它任何目錄下,都可以利用jspSmartUpload進(jìn)行下載。

    5、能將文件上傳到數(shù)據(jù)庫中,也能將數(shù)據(jù)庫中的數(shù)據(jù)下載下來。這種功能針對(duì)的是MYSQL數(shù)據(jù)庫,因?yàn)椴痪哂型ㄓ眯裕员疚牟粶?zhǔn)備舉例介紹這種用法。

      jspSmartUpload組件可以從http://www.edufans.com/html/JSP/JSP_down/2006/200610054829.html網(wǎng)站上自由下載,壓縮包的名字是jspSmartUpload.zip。下載后,用WinZip或WinRAR將其解壓到Tomcat的webapps目錄下(本文以Tomcat服務(wù)器為例進(jìn)行介紹)。解壓后,將webapps/jspsmartupload目錄下的子目錄Web-inf名字改為全大寫的WEB-INF,這樣一改jspSmartUpload類才能使用。因?yàn)門omcat對(duì)文件名大小寫敏感,它要求Web應(yīng)用程序相關(guān)的類所在目錄為WEB-INF,且必須是大寫。接著重新啟動(dòng)Tomcat,這樣就可以在JSP文件中使用jspSmartUpload組件了。

      注意,按上述方法安裝后,只有webapps/jspsmartupload目錄下的程序可以使用jspSmartUpload組件,如果想讓Tomcat服務(wù)器的所有Web應(yīng)用程序都能用它,必須做如下工作:

    1.進(jìn)入命令行狀態(tài),將目錄切換到Tomcat的webapps/jspsmartupload/WEB-INF目錄下。

    2.運(yùn)行JAR打包命令:jar cvf jspSmartUpload.jar com

    (也可以打開資源管理器,切換到當(dāng)前目錄,用WinZip將com目錄下的所有文件壓縮成jspSmartUpload.zip,然后將jspSmartUpload.zip換名為jspSmartUpload.jar文件即可。)

    3.將jspSmartUpload.jar拷貝到Tomcat的shared/lib目錄下。

    二、相關(guān)類說明篇

    File類

      這個(gè)類包裝了一個(gè)上傳文件的所有信息。通過它,可以得到上傳文件的文件名、文件大小、擴(kuò)展名、文件數(shù)據(jù)等信息。

      File類主要提供以下方法:

    1、saveAs作用:將文件換名另存。

    原型:

    public void saveAs(java.lang.String destFilePathName)



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

    其中,destFilePathName是另存的文件名,optionSaveAs是另存的選項(xiàng),該選項(xiàng)有三個(gè)值,分別是SAVEAS_PHYSICAL,SAVEAS_VIRTUAL,SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系統(tǒng)的根目錄為文件根目錄另存文件,SAVEAS_VIRTUAL表明以Web應(yīng)用程序的根目錄為文件根目錄另存文件,SAVEAS_AUTO則表示讓組件決定,當(dāng)Web應(yīng)用程序的根目錄存在另存文件的目錄時(shí),它會(huì)選擇SAVEAS_VIRTUAL,否則會(huì)選擇SAVEAS_PHYSICAL。

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

    建議:對(duì)于Web程序的開發(fā)來說,最好使用SAVEAS_VIRTUAL,以便移植。

    2、isMissing

    作用:這個(gè)方法用于判斷用戶是否選擇了文件,也即對(duì)應(yīng)的表單項(xiàng)是否有值。選擇了文件時(shí),它返回false。未選文件時(shí),它返回true。

    原型:public boolean isMissing()

    3、getFieldName

    作用:取HTML表單中對(duì)應(yīng)于此上傳文件的表單項(xiàng)的名字。

    原型:public String getFieldName()

    4、getFileName

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

    原型:public String getFileName()

    5、getFilePathName

    作用:取文件全名(帶目錄)

    原型:public String getFilePathName

    6、getFileExt

    作用:取文件擴(kuò)展名(后綴)

    原型:public String getFileExt()

    7、getSize

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

    原型:public int getSize()

    8、getBinaryData

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

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

    Files類

      這個(gè)類表示所有上傳文件的集合,通過它可以得到上傳文件的數(shù)目、大小等信息。有以下方法:

    1、getCount

    作用:取得上傳文件的數(shù)目。

    原型:public int getCount()

    2、getFile

    作用:取得指定位移處的文件對(duì)象File(這是com.jspsmart.upload.File,不是java.io.File,注意區(qū)分)。

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

    3、getSize

    作用:取得上傳文件的總長度,可用于限制一次性上傳的數(shù)據(jù)量大小。

    原型:public long getSize()

    4、getCollection

    作用:將所有上傳文件對(duì)象以Collection的形式返回,以便其它應(yīng)用程序引用,瀏覽上傳文件信息。

    原型:public Collection getCollection()

    5、getEnumeration

    作用:將所有上傳文件對(duì)象以Enumeration(枚舉)的形式返回,以便其它應(yīng)用程序?yàn)g覽上傳文件信息。

    原型:public Enumeration getEnumeration()

    Request類

      這個(gè)類的功能等同于JSP內(nèi)置的對(duì)象request。只所以提供這個(gè)類,是因?yàn)閷?duì)于文件上傳表單,通過request對(duì)象無法獲得表單項(xiàng)的值,必須通過jspSmartUpload組件提供的Request對(duì)象來獲取。該類提供如下方法:

    1、getParameter

    作用:獲取指定參數(shù)之值。當(dāng)參數(shù)不存在時(shí),返回值為null。

    原型:public String getParameter(String name)。其中,name為參數(shù)的名字。

    2、getParameterValues

    作用:當(dāng)一個(gè)參數(shù)可以有多個(gè)值時(shí),用此方法來取其值。它返回的是一個(gè)字符串?dāng)?shù)組。當(dāng)參數(shù)不存在時(shí),返回值為null。

    原型:public String[] getParameterValues(String name)。其中,name為參數(shù)的名字。

    3、getParameterNames

    作用:取得Request對(duì)象中所有參數(shù)的名字,用于遍歷所有參數(shù)。它返回的是一個(gè)枚舉型的對(duì)象。

    原型:public Enumeration getParameterNames()
    ㈣ SmartUpload類這個(gè)類完成上傳下載工作。

    A.上傳與下載共用的方法:

    只有一個(gè):initialize。

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

    原型:有多個(gè),主要使用下面這個(gè):

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

    其中,pageContext為JSP頁面內(nèi)置對(duì)象(頁面上下文)。

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

    1、upload

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

    原型:public void upload()

    2、save

    作用:將全部上傳文件保存到指定目錄下,并返回保存的文件個(gè)數(shù)。

    原型:public int save(String destPathName)

    和public int save(String destPathName,int option)

    其中,destPathName為文件保存目錄,option為保存選項(xiàng),它有三個(gè)值,分別是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。(同F(xiàn)ile類的saveAs方法的選項(xiàng)之值類似)SAVE_PHYSICAL指示組件將文件保存到以操作系統(tǒng)根目錄為文件根目錄的目錄下,SAVE_VIRTUAL指示組件將文件保存到以Web應(yīng)用程序根目錄為文件根目錄的目錄下,而SAVE_AUTO則表示由組件自動(dòng)選擇。

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

    3、getSize

    作用:取上傳文件數(shù)據(jù)的總長度

    原型:public int getSize()

    4、getFiles

    作用:取全部上傳文件,以Files對(duì)象形式返回,可以利用Files類的操作方法來獲得上傳文件的數(shù)目等信息。

    原型:public Files getFiles()

    5、getRequest

    作用:取得Request對(duì)象,以便由此對(duì)象獲得上傳表單參數(shù)之值。

    原型:public Request getRequest()

    6、setAllowedFilesList

    作用:設(shè)定允許上傳帶有指定擴(kuò)展名的文件,當(dāng)上傳過程中有文件名不允許時(shí),組件將拋出異常。

    原型:public void setAllowedFilesList(String allowedFilesList)

    其中,allowedFilesList為允許上傳的文件擴(kuò)展名列表,各個(gè)擴(kuò)展名之間以逗號(hào)分隔。如果想允許上傳那些沒有擴(kuò)展名的文件,可以用兩個(gè)逗號(hào)表示。例如:setAllowedFilesList("doc,txt,,")將允許上傳帶doc和txt擴(kuò)展名的文件以及沒有擴(kuò)展名的文件。

    7、setDeniedFilesList

    作用:用于限制上傳那些帶有指定擴(kuò)展名的文件。若有文件擴(kuò)展名被限制,則上傳時(shí)組件將拋出異常。

    原型:public void setDeniedFilesList(String deniedFilesList)

    其中,deniedFilesList為禁止上傳的文件擴(kuò)展名列表,各個(gè)擴(kuò)展名之間以逗號(hào)分隔。如果想禁止上傳那些沒有擴(kuò)展名的文件,可以用兩個(gè)逗號(hào)來表示。例如:setDeniedFilesList("exe,bat,,")將禁止上傳帶exe和bat擴(kuò)展名的文件以及沒有擴(kuò)展名的文件。

    8、setMaxFileSize

    作用:設(shè)定每個(gè)文件允許上傳的最大長度。

    原型:public void setMaxFileSize(long maxFileSize)

    其中,maxFileSize為為每個(gè)文件允許上傳的最大長度,當(dāng)文件超出此長度時(shí),將不被上傳。

    9、setTotalMaxFileSize

    作用:設(shè)定允許上傳的文件的總長度,用于限制一次性上傳的數(shù)據(jù)量大小。

    原型:public void setTotalMaxFileSize(long totalMaxFileSize)

    其中,totalMaxFileSize為允許上傳的文件的總長度。

    C.下載文件常用的方法

    1、setContentDisposition

    作用:將數(shù)據(jù)追加到MIME文件頭的CONTENT-DISPOSITION域。jspSmartUpload組件會(huì)在返回下載的信息時(shí)自動(dòng)填寫MIME文件頭的CONTENT-DISPOSITION域,如果用戶需要添加額外信息,請(qǐng)用此方法。

    原型:public void setContentDisposition(String contentDisposition)

    其中,contentDisposition為要添加的數(shù)據(jù)。如果contentDisposition為null,則組件將自動(dòng)添加"attachment;",以表明將下載的文件作為附件,結(jié)果是IE瀏覽器將會(huì)提示另存文件,而不是自動(dòng)打開這個(gè)文件(IE瀏覽器一般根據(jù)下載的文件擴(kuò)展名決定執(zhí)行什么操作,擴(kuò)展名為doc的將用word程序打開,擴(kuò)展名為pdf的將用acrobat程序打開,等等)。

    2、downloadFile

    作用:下載文件。

    原型:共有以下三個(gè)原型可用,第一個(gè)最常用,后兩個(gè)用于特殊情況下的文件下載(如更改內(nèi)容類型,更改另存的文件名)。

    ① public void downloadFile(String sourceFilePathName)

    其中,sourceFilePathName為要下載的文件名(帶目錄的文件全名)

    ② public void downloadFile(String sourceFilePathName,String contentType)

    其中,sourceFilePathName為要下載的文件名(帶目錄的文件全名),contentType為內(nèi)容類型(MIME格式的文件類型信息,可被瀏覽器識(shí)別)。

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

    其中,sourceFilePathName為要下載的文件名(帶目錄的文件全名),contentType為內(nèi)容類型(MIME格式的文件類型信息,可被瀏覽器識(shí)別),destFileName為下載后默認(rèn)的另存文件名。

    三、文件上傳篇

    ㈠ 表單要求

    對(duì)于上傳文件的FORM表單,有兩個(gè)要求:

    1、METHOD應(yīng)用POST,即METHOD="POST"。

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

    下面是一個(gè)用于上傳文件的FORM表單的例子:

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


    ㈡ 上傳的例子

    1、上傳頁面upload.html

    本頁面提供表單,讓用戶選擇要上傳的文件,點(diǎn)擊"上傳"按鈕執(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í)行文件上傳操作。頁面源碼中詳細(xì)介紹了上傳方法的用法,在此不贅述了。

    頁面源碼如下:

    <%--
                文件名: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>
                <%
                // 新建一個(gè)SmartUpload對(duì)象
                SmartUpload su = new SmartUpload();
                // 上傳初始化
                su.initialize(pageContext);
                // 設(shè)定上傳限制
                // 1.限制每個(gè)上傳文件的最大長度。
                // su.setMaxFileSize(10000);
                // 2.限制總上傳數(shù)據(jù)的長度。
                // su.setTotalMaxFileSize(20000);
                // 3.設(shè)定允許上傳的文件(通過擴(kuò)展名限制),僅允許doc,txt文件。
                // su.setAllowedFilesList("doc,txt");
                // 4.設(shè)定禁止上傳的文件(通過擴(kuò)展名限制),禁止上傳帶有exe,bat,
                jsp,htm,html擴(kuò)展名的文件和沒有擴(kuò)展名的文件。
                // su.setDeniedFilesList("exe,bat,jsp,htm,html,,");
                // 上傳文件
                su.upload();
                // 將上傳文件全部保存到指定目錄
                int count = su.save("/upload");
                out.println(count+"個(gè)文件上傳成功!<br>");
                // 利用Request對(duì)象獲取參數(shù)之值
                out.println("TEST="+su.getRequest().getParameter("TEST")
                +"<BR><BR>");
                // 逐一提取上傳文件信息,同時(shí)可保存文件。
                for (int i=0;i<su.getFiles().getCount();i++)
                {
                com.jspsmart.upload.File file = su.getFiles().getFile(i);
                // 若文件不存在則繼續(xù)
                if (file.isMissing()) continue;
                // 顯示當(dāng)前文件信息
                out.println("<TABLE BORDER=1>");
                out.println("<TR><TD>表單項(xiàng)名(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>文件擴(kuò)展名(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應(yīng)用程序的根目錄為文件根目錄的目錄下
                // 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">點(diǎn)擊下載</a>
                </body>
                </html>


    2、下載處理頁面do_download.jsp do_download.jsp展示了如何利用jspSmartUpload組件來下載文件,從下面的源碼中就可以看到,下載何其簡(jiǎn)單。

    源碼如下:

    <%@ page contentType="text/html;charset=gb2312"
                import="com.jspsmart.upload.*" %><%
                // 新建一個(gè)SmartUpload對(duì)象
                SmartUpload su = new SmartUpload();
                // 初始化
                su.initialize(pageContext);
                // 設(shè)定contentDisposition為null以禁止瀏覽器自動(dòng)打開文件,
                //保證點(diǎn)擊鏈接后是下載文件。若不設(shè)定,則下載的文件擴(kuò)展名為
                //doc時(shí),瀏覽器將自動(dòng)用word打開它。擴(kuò)展名為pdf時(shí),
                //瀏覽器將用acrobat打開。
                su.setContentDisposition(null);
                // 下載文件
                su.downloadFile("/upload/如何賺取我的第一桶金.doc");
                %>


    注意,執(zhí)行下載的頁面,在Java腳本范圍外(即<% ... %>之外),不要包含HTML代碼、空格、回車或換行等字符,有的話將不能正確下載。不信的話,可以在上述源碼中%><%之間加入一個(gè)換行符,再下載一下,保證出錯(cuò)。因?yàn)樗绊懥朔祷亟o瀏覽器的數(shù)據(jù)流,導(dǎo)致解析出錯(cuò)。

    3、如何下載中文文件

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

    為了給jspSmartUpload組件增加下載中文文件的支持,我對(duì)該組件進(jìn)行了研究,發(fā)現(xiàn)對(duì)返回給瀏覽器的另存文件名進(jìn)行UTF-8編碼后,瀏覽器便能正確顯示中文名字了。這是一個(gè)令人高興的發(fā)現(xiàn)。于是我對(duì)jspSmartUpload組件的SmartUpload類做了升級(jí)處理,增加了toUtf8String這個(gè)方法,改動(dòng)部分源碼如下:

    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();
                }
                /**
                * 將文件名中的漢字轉(zhuǎn)為UTF8編碼的串,以便下載時(shí)能正確顯示另存的文件名.
                * 縱橫軟件制作中心雨亦奇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組件對(duì)返回的文件未作任何處理,現(xiàn)在做了編碼的轉(zhuǎn)換工作,將文件名轉(zhuǎn)換為UTF-8形式的編碼形式。UTF-8編碼對(duì)英文未作任何處理,對(duì)中文則需要轉(zhuǎn)換為%XX的形式。toUtf8String方法中,直接利用Java語言提供的編碼轉(zhuǎn)換方法獲得漢字字符的UTF-8編碼,之后將其轉(zhuǎn)換為%XX的形式。

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

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

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

    JavaScript

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

    范 例 5:

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

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

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

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

    這 一 個(gè) 連 結(jié) 的 作 法:

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

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

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

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

    好 了, 利 用 以 上 的 特 性 可 以 很 簡(jiǎn) 單 的 完 成 第 二 個(gè) 連 結(jié) 的 例 子! 相 當(dāng) 簡(jiǎn) 單, 以

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

    多 加 解 釋 了, 作 法 如 下:

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


    范 例 6:

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

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

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

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

    做 法 如 下:

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

    如 果 沒 有 特 別 指 定 時(shí) 間 與 日 期 的 話, 瀏 覽 器 將 會(huì) 采 用 本 地 客 戶 端 機(jī) 器 的 時(shí) 間, 若 將

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

    這 和 Java 或 其 他 的 程 式 語 言 在 用 到 變 數(shù) 之 前 必 需 先 加 以 宣 告 的 方 式 有 相 當(dāng) 大 的 不

    同。 在 完 成 today 的 日 期 變 數(shù) 後, 我 們 等 於 建 立 了 一 個(gè) 具 有 本 地 時(shí) 間 與 日 期 的 物 件

    (object)。 接 著 就 可 以 使 用 get... 的 method 以 取 得 today 這 個(gè) 物 件 的 時(shí) 間 和 日 期。

    請(qǐng) 注 意 getMonth 這 個(gè) method 所 取 得 的 月 份 范 圍 是 由 0~11, 所 以 必 須 加 1 以 代

    表 真 正 的 1 月 至 12 月。 看 完 以 上 的 例 子 後, 想 想 你 可 以 使 你 的 文 件 變 得 有 點(diǎn)

    智 慧, 例 如: 某 個(gè) 文 件 有 時(shí) 效 限 制 的 話, 你 可 以 利 用 我 們 在 上 一 部 份 的范 例 4

    中 所 提 到 的 功 能 和 這 一 個(gè) 范 例 中 所 學(xué) 習(xí) 到 的 功 能, 設(shè) 計(jì) 一 個(gè) 讓 你 的 文 件 在 第10天

    以 後 讀 到 的 話 就 會(huì) 告 訴 讀 者:"喂! 這 篇 已 過 時(shí) 了!"的 程 式, 試 試 看, 并 不 難!


    除 以 上 功 能 外, 在 建 立 日 期 物 件 時(shí) 你 也 可 以 事 先 設(shè) 定 日 期 如 下:

    docStarted= new Date(96,0,13)

    首 先 是 年(西 元), 接 著 是 月(但 記 得 減 1), 再 接 著 是 日。 同 樣 的 方 法 也 可 以

    加 上 時(shí) 間 的 設(shè) 定, 如 下:

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

    前 三 個(gè) 是 日 期 的 年、 月、 日, 接 著 是 時(shí)、 分、 秒。 最 後, 我 們 必 須 提 醒 你,

    JavaScript 并 沒 有 實(shí) 際 的 日 期 型 態(tài), 但 是 它 卻 能 毫 不 費(fèi) 力 地 顯 示 出 日 期 和 時(shí) 間,

    原 因 是 它 是 從 1 / 1 / 1970 0:0h 開 始 以 ms(milli seconds) 來 計(jì) 算 目 前 的 時(shí) 間 的,

    這 聽 起 來 似   有 些 復(fù) 雜, 但 你 倒 不 用 擔(dān) 心, 它 有 標(biāo) 準(zhǔn) 的 共 用 函 數(shù) 可 以 計(jì) 算,

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


    范 例 7:

    接 下 來 我 們 要 為 你 介 紹 一 個(gè) 可 以 產(chǎn) 生 亂 數(shù) 的 函 數(shù), 也 是 以 JavaScript 所 寫 的。

    這 個(gè) 函 數(shù) 只 是 利 用 了 一 點(diǎn) 小 技 巧 而 已, 而 這 種 技 巧 在 大 部 分 的 編 譯 器(compiler)中,

    大 都 是 如 此(或 類 似) 計(jì) 算 出 亂 數(shù) 來 的。 我 相 信 JavaScript 最 後 應(yīng) 也 會(huì) 以 相 似 的 方

    法 來 產(chǎn) 生 這 樣 的 method , 如 果 它 會(huì) 提 供 這 樣 功 能 的 話。 以 下 是 此 函 數(shù) 的 結(jié) 果:

    這 是 一 個(gè) 計(jì) 算 產(chǎn) 生 的 亂 數(shù): 0.9836312285070992

    以 下 是 這 個(gè) 作 法 的 寫 法:

    <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>

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

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

    算, 得 到 的 數(shù) 再 做 絕 對(duì) 值 的 運(yùn) 算, 結(jié) 果 可 以 得 到 一 個(gè) 介 於 0 與 1 間 的

    實(shí) 數(shù)。 因 為 時(shí) 間 的 改 變 是 ms 為 單 位, 而 且 你 絕 不 會(huì) 獲 得 相 同 的 數(shù) 字。

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

    是 不 定 時(shí), 久 久 的 用 一 次, 那 效 果 就 不 錯(cuò) 了!


    范 例 8:

    JavaScript 的 一 個(gè) 重 要 特 點(diǎn) 是 它 可 以 制 作 視 窗。 你 可 以 產(chǎn) 生 一 個(gè) 的 視 窗, 并 且

    在 此 視 窗 中 載 入 HTML 文 件, 完 全 以 JavaScript 來 航 游 網(wǎng) 際 網(wǎng) 路(Internet )。

    接 下 來 的 范 例 就 是 告 訴 你 如 何 開 啟 一 個(gè) 視 窗 并 且 寫 點(diǎn) 東 西 進(jìn) 去, 你 可 先 試 試

    按 一 下 范 中 之 接 鈕 看 看!

    原 始 程 式 如 下:

    <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>
    這 兒 你 又 看 到 用 按 鈕 來 啟 動(dòng) 函 數(shù)。 這 次 的 函 數(shù) WinOpen()是 藉 著 一 個(gè) open

    的 method 來 產(chǎn) 生 一 個(gè) 新 的 視 窗。 第 一 對(duì) 雙 引 號(hào)("")是 用 來 描 述 欲 載 入 至 視 窗

    中 的 文 件 URL 位 置。 如 果 留 者 空 白 的 話, 那 就 會(huì) 呈 現(xiàn) 一 個(gè) 空 白 視 窗, 并 可 以

    透 過 JavaScript 寫 入 東 西! 下 一 對(duì) 雙 引 號(hào) 內(nèi) 的 內(nèi) 容 是 這 個(gè) 新 開 啟 視 窗 的 名 字,

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

    會(huì) 出 現(xiàn) 錯(cuò) 誤 訊 息, 請(qǐng) 注 意。 接 下 來 的 一 連 串 雙 引 號(hào) 內(nèi) 所 指 定 的 是 該 視 窗

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

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

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

    字 中 間 不 可 以 有 空 白:

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

    以 上 的 pixels 部 分, 你 可 以 填 入 點(diǎn) 數(shù) 的 數(shù) 值, 這 數(shù) 值 是 告 訴 瀏 覽 器 這 個(gè) 視 窗 的

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

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

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

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


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

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

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

    來回傳輸資料,所以當(dāng)一位使用者輸入一項(xiàng)資料時(shí),它不用經(jīng)過傳給伺服端 (server)

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

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

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


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

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

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

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


     

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

    JavaScript 如何執(zhí)行呢?

    Netscape 2.0 beta 3 版以上,就可以執(zhí)行 JavaScript 的功能了,我們測(cè)試過至少

    beta 3 版以上可以,其他種類的 WWW 瀏覽器如:Internet Expore 3.0也有此一功能。


     

    以下我們就以一些例子來告訴你如何將 JavaScript 寫在 HTML 文件中,并且體會(huì)

    一下新語言的特性,我們從第一個(gè)例子開始:如何用 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 以上版本的話,那你就可以

    看到相關(guān)的結(jié)果,而如果你的瀏覽器并非是可以支援 JavaScript 的話,那看起

    來就會(huì)有一些怪怪的了,以上范例的結(jié)果如下:

    This is a normal HTML document.
    這是以 JavaScript 印出的!
    Back in HTML again.
    此一范例并沒有太大的用處,它只是要告訴你如何使用<script>的標(biāo)簽,并

    如何將它置於 HTML 的文件之中而已,這個(gè)新的標(biāo)簽?zāi)憧梢蕴厮旁谖募?/span>

    中的任何地方。


     



    范例 2:

    接下來下一個(gè)例子所要介紹的是有關(guān)函數(shù) (function) 的使用。請(qǐng)放心,函數(shù)并

    非很難懂的東西,但它卻相當(dāng)有用。函數(shù)通常是在 HTML 文件中 <body >的

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

    的部份。好讓在 <body> 部分中使用到函數(shù)時(shí),它已確定被讀取住來。另外,

    <script> 標(biāo)簽的有關(guān)描述語法剖份,你可以用注解的符號(hào)將它括起來,以免舊

    版或無法讀取 JavaScript 的瀏覽器讀到,而誤會(huì)了意思!

    <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 語法部份

    的結(jié)果如下,你可以試著按按鈕看看有何結(jié)果產(chǎn)生!

    在范例 2 中,將會(huì)產(chǎn)生一個(gè)按鈕,當(dāng)你用滑鼠去按它的時(shí)候,應(yīng)該會(huì)出現(xiàn)

    一個(gè)視窗上面有“嗨! 你好”的字串,如何?不錯(cuò)吧!這個(gè)結(jié)果是如何產(chǎn)生

    的呢?首先,在 <head>內(nèi)的函數(shù)會(huì)被載入并存於內(nèi)存中,接著一個(gè)新

    的 <form>標(biāo)簽 <input type ="button".....>將產(chǎn)生一個(gè)接鈕。然後,你可以

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

    onClick 後的函數(shù) 'pushbutton()',而這個(gè)函數(shù)在剛剛程式被載入時(shí)就已安放在

    記憶體中了!請(qǐng)注意,在這個(gè)函數(shù)中我們用到了個(gè)新東西- alert 的 method,

    是 JavaScript 事先定義好的,它會(huì)以對(duì)話視窗產(chǎn)生內(nèi)涵的訊息,并有一"確定"

    (OK)的按鈕。 JavaScript 定義了許多的 method,你可以連至 Netscape 公司去

    獲取較完整的訊息。我想這些 method 在不久的將來會(huì)有長長的一串可以夠你

    學(xué)的,不過目前的 method 也已經(jīng)可以做出相當(dāng)多東西了!

    接著下個(gè)例子將告訴你如何由一個(gè)輸入型表格中讀入使用者的輸入資料,

    事實(shí)上,這也是加入個(gè)函數(shù)就可以達(dá)成的。


     



    范例 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)在你可以試試結(jié)果如何:

    請(qǐng)輸入你的名字:

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

    的 WWW 瀏覽器因?yàn)椴徽J(rèn)識(shí)這些函數(shù)而產(chǎn)生錯(cuò)誤。它的順序應(yīng) 該為 <script>

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

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

    JavaScript 的注解,若省略了的話, ->之前的字會(huì)被誤認(rèn)為是 JavaScript 的指令。


    這個(gè)例子可以讓使用者輸入一段文字,然後再輸入完畢後經(jīng)由 <input>標(biāo)簽中的

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

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

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


     



    范例 4:

    這個(gè)范例更是帥了!我們?cè)?HTML 文件檔完成了以後,常會(huì)加上一行文件

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

    很簡(jiǎn)單的寫一個(gè)如下的描述語法程式,就可以自動(dòng)的為你每次產(chǎ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 叁數(shù)在 Netscape 2.0 beta 2 版時(shí)是被寫成

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

    所以注意一下 ;JavaScript 本身是會(huì)區(qū)分大小寫的, lastmodifiedlastModified

    在它看來是不同的結(jié)果。

    最後,在這一部分結(jié)束之前,要提醒你一點(diǎn),像范例 4 ,的用法并非每一部

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

    結(jié)果,所以,或許你仍得測(cè)一測(cè)不同機(jī)器的結(jié)果才會(huì)有所定論。當(dāng)然,這一切

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

    公司才知道。也許你也不用奇怪,當(dāng)你隔周再來訪時(shí),JavaScript 可能又作了

    相當(dāng)大的改變了呢

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

    posted @ 2008-06-30 11:20 sunny spring 閱讀(303) | 評(píng)論 (0)編輯 收藏

    HTML標(biāo)簽詳解

    HTML指令詳解
    結(jié)構(gòu)
    <html>
    <head>
    <title>標(biāo)題<title>
    </head>
    <body>..........文件內(nèi)容..........
    </body>
    </html>
    1.文件標(biāo)題
    <title>..........</title>
    2.文件更新--<meta>
    【1】10秒后自動(dòng)更新一次
    <meta http-equiv="refresh" content=10>
    【2】10秒后自動(dòng)連結(jié)到另一文件
    <meta http-equiv="refresh" content="10;URL=欲連結(jié)文件之URL">
    3.查詢用表單--<isindex>
    若欲設(shè)定查詢欄位前的提示文字:
    <isindex prompt="提示文字">
    4.預(yù)設(shè)的基準(zhǔn)路徑--<base>
    <base href="放置文件的主機(jī)之URL">
    版面
    1.標(biāo)題文字 <h#>..........</h#> #=1~6;h1為最大字,h6為最小字
    2.字體變化 <font>..........</font>
    【1】字體大小 <font size=#>..........</font> #=1~7;數(shù)字愈大字也愈大
    【2】指定字型 <font face="字型名稱">..........</font>
    【3】文字顏色 <font color=#rrggbb>..........</font> rr:表紅色(red)色碼 gg:表綠色(green)色碼 bb:表藍(lán)色(blue)色碼
    3.顯示小字體 <small>..........</small>
    4.顯示大字體 <big>..........</big>
    5.粗體字 <b>..........</b>
    6.斜體字 <i>..........</i>
    7.打字機(jī)字體 <tt>..........</tt>
    8.底線 <u>..........</u>
    9.刪除線 <strike>..........</strike>
    10.下標(biāo)字 <sub>..........</sub>
    11.上標(biāo)字 <sup>..........</sup>
    12.文字閃爍效果 <blink>..........</blink>
    13.換行 <br>
    14.分段 <p>
    15.文字的對(duì)齊方向 <p align="#"> #號(hào)可為 left:表向左對(duì)齊(預(yù)設(shè)值) center:表向中對(duì)齊 right:表向右對(duì)齊 P.S.<p align="#">之后的文字都會(huì)以所設(shè)的對(duì)齊方式顯示, 直到出現(xiàn)另一個(gè)<p align="#">改變其對(duì)齊方向,或遇到 <hr>ⅱ<h#>標(biāo)簽時(shí)會(huì)自動(dòng)設(shè)回預(yù)設(shè)的向左對(duì)齊。
    16.分隔線 <hr>
    【1】分隔線的粗細(xì) <hr size=點(diǎn)數(shù)>
    【2】分隔線的寬度 <hr size=點(diǎn)數(shù)或百分比>
    【3】分隔線對(duì)齊方向 <hr align="#"> #號(hào)可為 left:表向左對(duì)齊(預(yù)設(shè)值) center:表向中對(duì)齊 right:表向右對(duì)齊
    【4】分隔線的顏色 <hr color=#rrggbb>
    【5】實(shí)心分隔線 <hr noshade>
    17.向中對(duì)齊 <center>..........</center>
    18.依原始樣式顯示 <pre>..........</pre>
    19.<body>指令的屬性
    【1】背景顏色 -- bgcolor <body bgcolor=#rrggbb>
    【2】背景圖案 -- background <body background="圖形文件名">
    【3】設(shè)定背景圖案不會(huì)卷動(dòng) -- bgproperties <body bgproperties=fixed>
    【4】文件內(nèi)容文字的顏色 -- text <body text=#rrggbb>
    【5】超連結(jié)文字顏色 -- link <body link=#rrggbb>
    【6】正被選取的超連結(jié)文字顏色 -- vlink <body vlink=#rrggbb>
    【7】已連結(jié)過的超連結(jié)文字顏色 -- alink <body alink=#rrggbb>
    20.注解 <!--..........-->21.特殊字元表示法
    符 號(hào) 語 法
    < &lt
    > &gt
    & &amp
    " &quot
    空白 &nbsp

    圖片
    1.插入圖片 <img src="圖形文件名">
    2.設(shè)定圖框 -- border <img src="圖形文件名" border=點(diǎn)數(shù)>
    3.設(shè)定圖形大小 -- widthⅱheight <img src="圖形文件名" width=寬度點(diǎn)數(shù) height=高度點(diǎn)數(shù)>
    4.設(shè)定圖形上下左右留空 -- vspaceⅱhspace <img src="圖形文件名" vspace=上下留空點(diǎn)數(shù) hspace=左右留空點(diǎn)數(shù)>
    5.圖形附注 <img src="圖形文件名" alt="說明文字">
    6.預(yù)載圖片
    <img src="高解析度圖形文件名" lowsrc="低解析度圖形文件名"> P.S.兩個(gè)圖的圖形大小最好一致
    7.影像地圖(Image Map) <img src="圖形文件名" usemap="#圖的名稱"> <map name="圖的名稱"

    <area shape=形狀 coords=區(qū)域座標(biāo)列表 href="連結(jié)點(diǎn)之URL">
    <area shape=形狀 coords=區(qū)域座標(biāo)列表 href="連結(jié)點(diǎn)之URL">
    <area shape=形狀 coords=區(qū)域座標(biāo)列表 href="連結(jié)點(diǎn)之URL">
    <area shape=形狀 coords=區(qū)域座標(biāo)列表 href="連結(jié)點(diǎn)之URL"> </map>
    【1】定義形狀 -- shape
    shape=rect:矩形 shape=circle:圓形 shape=poly:多邊形
    【2】定義區(qū)域 -- coords
    a.矩形:必須使用四個(gè)數(shù)字,前兩個(gè)數(shù)字為左上角座標(biāo),后兩個(gè)數(shù)字為右下角座標(biāo)
    例:<area shape=rect coords=100,50,200,75 href="URL">
    b.圓形:必須使用三個(gè)數(shù)字,前兩個(gè)數(shù)字為圓心的座標(biāo),最后一個(gè)數(shù)字為半徑長度
    例:<area shape=circle coords=85,155,30 href="URL">
    c.任意圖形(多邊形):將圖形之每一轉(zhuǎn)折點(diǎn)座標(biāo)依序填入
    例:<area shape=poly coords=232,70,285,70,300,90,250,90,200,78 href="URL">
    表格
    1.定義表格 <table>..........</table>
    【1】設(shè)定邊框的厚度 -- border
    <table border=點(diǎn)數(shù)>
    【2】設(shè)定格線的寬度 -- cellspacing
    <table cellspacing=點(diǎn)數(shù)>
    【3】設(shè)定資料與格線的距離 -- cellpadding
    <table cellpadding=點(diǎn)數(shù)>
    【4】調(diào)整表格寬度 -- width
    <table width=點(diǎn)數(shù)或百分比>
    【5】調(diào)整表格高度 -- height
    <table height=點(diǎn)數(shù)或百分比>
    【6】設(shè)定表格背景色彩 -- bgcolor
    <table bgcolor=#rrggbb>
    【7】設(shè)定表格邊框色彩 -- bordercolor
    <table bordercolor=#rrggbb

    2.顯示格線 <table border>
    3.表格標(biāo)題
    <caption>..........</caption>
    表格標(biāo)題位置 -- align
    <caption align="#"> #號(hào)可為 top:表標(biāo)題置于表格上方(預(yù)設(shè)值)
    bottom:表標(biāo)題置于表格下方
    4.定義列 <tr>
    5.定義欄位 《1》<td>:靠左對(duì)齊
    《2》<th>:靠中對(duì)齊ⅱ粗體
    【1】水平位置 -- align <th align="#">
    #號(hào)可為 left:向左對(duì)齊
    center:向中對(duì)齊 right:向右對(duì)齊
    【2】垂直位置 -- align <th align="#"> #號(hào)可為
    top:向上對(duì)齊 middle:向中對(duì)齊
    bottom:向下對(duì)齊
    【3】欄位寬度 -- width
    <th width=點(diǎn)數(shù)或百分比>
    【4】欄位垂直合并 -- rowspan
    <th rowspan=欲合并欄位數(shù)>
    【5】欄位橫向合并 -- colspan
    <th colspan=欲合并欄位數(shù)>
    清單
    一、目錄式清單
    <dir> <li>項(xiàng)目1 <li>項(xiàng)目2 <li>項(xiàng)目3 </dir> P.S.目錄式清單每一個(gè)項(xiàng)目不能超過20個(gè)字元(即10個(gè)中文字)
    二、選項(xiàng)式清單 <menu> <li>項(xiàng)目1 <li>項(xiàng)目2 <li>項(xiàng)目3 </menu>
    三、有序號(hào)的清單 <o(jì)l> <li>項(xiàng)目1 <li>項(xiàng)目2 <li>項(xiàng)目3 </ol>
    【1】序號(hào)形式 -- type <o(jì)l type=#>或<li type=#> #號(hào)可為 A:表以大寫英文字母AⅱBⅱCⅱD...做為項(xiàng)目編號(hào) a:表以小寫英文字母aⅱbⅱcⅱd...做為項(xiàng)目編號(hào) I:表以大寫羅馬數(shù)字做為項(xiàng)目編號(hào) i:表以小寫羅馬數(shù)字做為項(xiàng)目編號(hào) 1:表以阿拉伯?dāng)?shù)字做為項(xiàng)目編號(hào)(預(yù)設(shè)值)
    【2】起始數(shù)字 -- start <o(jì)l start=欲開始計(jì)數(shù)的序數(shù)>
    【3】指定編號(hào) -- value <li value=欲指定的序數(shù)>
    四、無序號(hào)的清單 <ul> <li>項(xiàng)目1 <li>項(xiàng)目2 <li>項(xiàng)目3 </ul>

    【1】項(xiàng)目符號(hào)形式 -- type <ul type=#>或<li type=#> #號(hào)可為 disc:實(shí)心圓點(diǎn)(預(yù)設(shè)值) circle:空心圓點(diǎn) square:實(shí)心方塊
    【2】原始清單 -- plain <ul plain>
    【3】清單排列方式 -- warp 《1》清單垂直排列 <ul warp = vert> 《2》清單水平排列 <ul warp = horiz>
    五、定義式清單 <dl> <dt>項(xiàng)目1 <dd>項(xiàng)目1說明 <dt>項(xiàng)目2 <dd>項(xiàng)目2說明 <dt>項(xiàng)目3 <dd>項(xiàng)目3說明 </dl>
    緊密排列 -- compact <dl compact> P.S.如此可使<dt>的內(nèi)容與<dd>的內(nèi)容在同一行,僅 以數(shù)格空白相隔而不換行,但若<dt>的文字超過一 定的長度后,compact的作用就消失了!
    表單
    一、基本架構(gòu) <form action="處理資料用的CGI程式之URL"或"mailt電子信箱的URL" method="get或post"> .......... .......... .......... </form>
    二、輸入文件型表單 <form action="URL" method="post"> <input> <input> .......... .......... </form>
    【1】欄位類型 -- type <input type=#> #號(hào)可為 text:文字輸入 password:密碼 checkbox:多選鈕 radio:?jiǎn)芜x鈕 submit:接受按鈕 reset:重設(shè)按鈕 image:圖形鈕 hidden:隱藏欄位
    【2】欄位名稱 -- name <input name="資料欄名"> P.S.若type為submitⅱreset則name不必設(shè)定
    【3】文件上的預(yù)設(shè)值 -- value <input value="預(yù)設(shè)之字串">
    【4】設(shè)定欄位的寬度 -- size <input size=字元數(shù)>
    【5】限制最大輸入字串的長度 -- maxlength <input maxlength=字元數(shù)>
    【6】預(yù)設(shè)checkbox或radio的初值 -- checked <input type=checkbox checked> <input type=radio checked>

    【7】指定圖形的URL -- src <input type=image src="圖檔名">
    【8】圖文對(duì)齊 -- align <input type=image align="#"> #號(hào)可為 top:文字對(duì)齊圖片之頂端 middle:文字對(duì)齊圖片之中間 buttom:文字對(duì)齊圖片之底部
    三、選擇式表單 <form action="URL" method="post"> <select> <o(jì)ption> <o(jì)ption> .......... .......... </select> </form>
    A、<select>的屬性
    【1】欄位名稱 -- name <select name="資料欄位名">
    【2】設(shè)定顯示的選項(xiàng)數(shù) -- size <select size=個(gè)數(shù)>
    【3】多重選項(xiàng) -- multiple <select multiple>
    B、<o(jì)ption>的屬性
    【1】定義選項(xiàng)的傳回值 -- value <o(jì)ption value="傳回值">
    【2】預(yù)先選取的選項(xiàng) -- selected <o(jì)ption selected>
    四、多列輸入文字區(qū)表單 <form action="URL" method="post"> <textarea> .......... .......... </textarea> </form>
    【1】文字區(qū)的變數(shù)名稱 -- name <textarea name=變數(shù)名稱>
    【2】設(shè)定文字輸入?yún)^(qū)寬度 -- cols <textarea cols=字元數(shù)>
    【3】設(shè)定文字輸入?yún)^(qū)高度 -- rows <textarea rows=列數(shù)>
    【4】輸入?yún)^(qū)設(shè)定預(yù)設(shè)字串 <textarea> 預(yù)設(shè)文字 </textarea>
    【5】自動(dòng)換行與否 -- wrap <textarea wrap=#> #號(hào)可為 off:表輸入的文字超過欄寬時(shí),不會(huì)自動(dòng)換行(預(yù)設(shè)值) virtual:表輸入的文字在超過欄寬時(shí)會(huì)自動(dòng)換行
    鏈接
    一、連結(jié)至其他文件 <a href="URL">說明文字或圖片</a>

    二、連結(jié)至文件內(nèi)之某一處(外部連結(jié))
    《1》起點(diǎn)
    <a href="檔名#名稱">..........</a>
    《2》終點(diǎn) <a name="名稱">
    三、frame的超連結(jié)
    【1】開啟新的瀏覽器來顯示連結(jié)文件 -- _blank <a href="URL" target=_blank>
    【2】顯示連結(jié)文件於目前的frame -- _self <a href="URL" target=_self>
    【3】以上一層的分割視窗顯示連結(jié)文件 -- _parent <a href="URL" target=_parent>
    【4】以全視窗顯示連結(jié)文件 -- _top <a href="URL" target=_top>
    【5】以特定視窗顯示連結(jié)文件 --<a href="URL" target="特定視窗名稱">
    FRAME
    一、分割視窗指令 <frameset>..........</frameset>
    【1】垂直(上下)分割 -- rows
    <frameset rows=#> #號(hào)可為點(diǎn)數(shù):如欲分割為100,200,300三個(gè)視窗,則
    <frameset rows=100,200,300>;亦可以*號(hào)代表,如<frameset rows=*,500,*>
    百分比:如<frameset rows=30%,70%>,各 項(xiàng)總和最好為100%
    【2】水平(左右)分割 -- cols <frameset cols=點(diǎn)數(shù)或百分比>
    二ⅱ指定視窗內(nèi)容 -- <frame>
    <frameset cols=30%,70%> <frame> <frame> </frameset>
    【1】指定視窗的文件名稱 -- src <frame src=HTML檔名>
    【2】定義視窗的名稱 -- name
    <frame name=視窗名稱>
    【3】設(shè)定文件與上下邊框的距離 -- marginheight
    <frame marginheight=點(diǎn)數(shù)>
    【4】設(shè)定文件與左右邊框的距離 -- marginwidth
    <frame marginwidth=點(diǎn)數(shù)>
    【5】設(shè)定分割視窗卷軸 -- scrollin

    <frame scrolling=#> #號(hào)可為 yes:固定出現(xiàn)卷軸
    no:不出現(xiàn)卷軸 auto:自動(dòng)判斷文件大小需不需要卷軸(預(yù)設(shè)值)
    【6】鎖住分割視窗的大小 -- noresize <frame noresize>

    posted @ 2008-06-30 11:16 sunny spring 閱讀(454) | 評(píng)論 (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錯(cuò)誤";
    81          } catch (NullPointerException e) {
    82              result = "getBytes 失敗 NullPointerException錯(cuò)誤";
    83          } catch (IOException ex1) {
    84              result = "IOException 錯(cuò)誤 ";
    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){//去掉上傳文件的參數(shù)以及編碼
    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 閱讀(5296) | 評(píng)論 (1)編輯 收藏

    僅列出標(biāo)題  下一頁
    主站蜘蛛池模板: 日本中文字幕免费看| 一二三四免费观看在线电影 | 成人免费毛片视频| 亚洲人成网7777777国产| 色欲aⅴ亚洲情无码AV| 国产成人精品免费视频大| 伊人亚洲综合青草青草久热| 亚洲精品国产第一综合99久久| 精品无码AV无码免费专区| 亚洲午夜日韩高清一区| 亚洲另类无码专区丝袜| 国产成人精品免费视频大全麻豆| 亚洲中文字幕第一页在线| 亚洲aⅴ无码专区在线观看春色| 57PAO成人国产永久免费视频| 亚洲av中文无码乱人伦在线播放| 男女污污污超污视频免费在线看| 国产成人无码免费看视频软件 | 99免费在线视频| 午夜亚洲av永久无码精品| 久久亚洲最大成人网4438| 亚洲免费视频在线观看| 相泽亚洲一区中文字幕| 色偷偷亚洲男人天堂| 在线成人a毛片免费播放 | 国产精品自在自线免费观看| 亚洲人成日本在线观看| 人妻无码久久一区二区三区免费 | 国产一级高青免费| 亚洲国产成人久久综合一区77 | 国产成人精品高清免费| 日本亚洲色大成网站www久久| 91短视频免费在线观看| 亚洲影院在线观看| 九九美女网站免费| 国产亚洲精品a在线无码| 国产精品小视频免费无限app| 亚洲国产高清精品线久久| 羞羞漫画在线成人漫画阅读免费 | 亚洲人成网站色7799| 国产精品视频免费一区二区|